Linux C语言学习day7:数组+指针基础

本文介绍了Linux环境下C语言学习中的字符数组和指针基础知识,包括字符数组的概念、初始化、输入输出方法,如使用scanf、gets、puts函数。还探讨了字符串长度计算、字符串复制、拼接、比较的string族函数strlen、strcpy、strcat、strcmp等,并讲解了二维字符数组的使用。最后,简要介绍了指针的概念、赋值、运算以及指针与数组的关系。

【1】字符数组
    概念:一组字符的集合
    定义:char s[10];
    初始化:
       char s[10] = "hello";
       char s[10] = {"hello"};
       char s[10] = {'h','e','l','l','o'};
       字符串结束标志为'\0'

    注:如果未对字符串进行初始化,后面需要对字符数组进行赋值时,
    可以用strcpy实现。
    
    练习1:实现求字符串实际长度
           
    字符数组输入:
       1)按字符输入
          for(i=0;i<5;i++)
          {
             scanf("%c",&s[i]);
          }       
             //必须指定输入多少个字符
       2)按字符串输入
          scanf("%s",s);       
          //空格无法输入到数组
       3)字符串输入函数gets
          char *gets(char *s);
          功能:字符串输入函数
          参数:char *s 要输入的字符数组首地址
          返回值:char * 同参数
          //不考虑数组越界问题          
       
    字符数组输出:       
       1)按字符输出
          for(i=0;i<5;i++)
          {
             printf("%c",s[i]);
          }       
       2)按字符串输出
          printf("%s",s);  //s即为字符串首地址       
       
       3)字符串输出函数
          int puts(const char *s);
          功能:字符串输出函数
          参数:const char *s 要输出的字符数组首地址
          返回值:int 整型 实际输出的字符个数
       
        输出换行符:
           printf("\n");
           putchar(10);
           putchar('\n');
           puts("");

【2】string族函数
    1)strlen
     #include <string.h>  
     size_t strlen(const char *s);
     功能:计算字符串实际长度(到'\0'截止)
     参数:要计算的字符串的首地址
     返回值:size_t => int 字符串的实际长度
      
    typedef 重定义
    typedef   类型名               自定义名;
    typedef   signed          char int8_t;  //等同于将signed char起别名为int8_t;
    typedef   signed short     int int16_t;
    typedef   signed           int int32_t;
    typedef   signed       __INT64 int64_t;

     面试题:说一下strlen和sizeof的区别?
     答:strlen是个函数,而sizeof是个关键字。
         strlen的功能是计算字符数组里存放的字符串的实际长度,
         而sizeof是计算的整个数组实际占用的字节数。

    2)strcpy
      #include <string.h>
      char *strcpy(char *dest, const char *src);
      功能:字符串复制
      参数:char *dest       目标字符数组首地址  
            const char *src     源字符数组首地址 
      返回值:char * 目标字符数组首地址      
      
      char *strncpy(char *dest, const char *src, size_t n);
      参数: size_t n :要复制的字符个数
      
      练习:仿写strcpy的功能
            s1[64] = "djakdj"  s2[64] = "abc"
            puts(s1)
            打印结果:abc
            
            研究strncpy的用法 仿写strncpy  
            
    3)strcat
    #include <string.h>
    char *strcat(char *dest, const char *src);
    功能:实现字符串拼接
    参数:dest 目标字符串地址  src:源字符串的地址 n:要拼接字符的个数
    返回值:目标字符串地址
    
    char *strncat(char *dest, const char *src, size_t n);
    
    4)strcmp    
    #include <string.h>
    int strcmp(const char *s1, const char *s2);
    功能:比较字符串首个不同的字符的ascii码
    参数:字符串的首地址
    返回值:
    -1   s1 < s2    
     1   s1 > s2
     0   s1 = s2 
     
     abcd < abd
     比较对应位上数据的ascii码的大小 
     int strncmp(const char *s1, const char *s2, size_t n);
     指定比较字符串的前n位

    if(strcmp(s1,s2) == 0)
    if(!strcmp(s1,s2))
    //用于判断两个字符串是否相等,相等则执行if的语句块。

【3】二维字符数组
    char s[3][10]={"hello","world","hqyj"}; 
    打印world:
    printf("%s\n",s[1]); 
    puts(s[1]);
    puts(&s[1][0]);
   
    打印‘w’:
      printf("%c",s[1][0]); 
   
     
【3】指针
    概念:
      地址:内存中每个字节都有唯一的编号,这个编号即为地址。
      指针:指针就是地址,地址就是指针。
      指针变量:存放地址的变量称之为指针变量。
    定义格式:
      [存储类型]  [数据类型]  *指针名
       (auto)      int        *p;
       //定义指针变量时,*仅起标识作用,用于说明这个是指针变量。
    赋值:
        1)指向整型变量
           int a = 10;
           int *p = &a;  //指针变量p里面存放的是a的地址

           int a = 10;
           int *p;
           p = &a;
  
        2)指向数组
           int a[5] = {1,2,3,4,5};
           int *p = a;           
    
    指针运算:
       1)算术运算
          p+1:访问了高地址方向一个数据的地址,指针的实际指向未改变。
          p-1:访问了低地址方向一个数据的地址,指针的实际指向未改变。
          p++:指针向高地址方向移动一个数据,指针的指向改变。
          p--:指针向低地址方向移动一个数据,指针的指向改变。
       2)关系运算     > < == !=   
            指向高地址的指针大于指向低地址的指针。
          指向不同类型数据的指针没有运算关系,指向不同区域的指针运算也没有意义。
       3)取值符  *
          取址符  &
          tip:&和*互为逆运算。
          
          1)int a = 10;
             int *p = &a; 
          
             访问a的地址:
                  &a   p           
             访问a的值:
                  a   *p
                  
          2)int a[5] = {1,2,3,4,5};
             int *p;
             p = a;             
          
             访问元素a[2]的地址:
                &a[2]     a+2  
                &p[2]     p+2
             访问元素a[2]的值:
                 a[2]    *(a+2)                  
                 p[2]    *(p+2)   
            
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值