美文网首页
指针与数组

指针与数组

作者: lxr_ | 来源:发表于2021-10-08 22:41 被阅读0次
    //当指针指向数组元素的时候,可以对指针变量进行加减运算,如*(p+n),且支持[]运算符,如p[n]
    //此时指针p+n指向原来指针p后面第n个元素p[n],而不是简单的将地址加一,而是加了数组中每个元素类型所占字节大小,p[n]=*(p+n)
    //不一定需要通过定义指针指向数组来访问数组中的元素,数组名本身就是数组首地址
    //可以使用字符指针定义字符串,用[](下标)访问字符串**
    
    #include <stdio.h>
    #include <string.h>
       
    int main(int argc, char** argv)
    {
        char a[] = "helloworld";
        char* p = a;
    
        printf("*p=%c,*(p+2)=%c,p[2]=%c\n", *p, *(p + 2), p[2]);  //*p=h,*(p+2)=l,p[2]=l
        printf("p:%p,p+1:%p\n", p, p + 1);//p:009DF6E4,p+1:009DF6E5  //相差一个字节,每次运行结果可能不一样
                          //由于该指针指向char类型数组,数组每个元素占一个字节,故p+1指向下一个元素的同时地址也加一
    
        int b[] = { 1,2,3 };
        int* pp = b;  //指针指向b数组
        printf("*pp=%d,*(pp+2)=%d,pp[2]=%d\n", *pp, *(pp + 2), pp[2]);  //*pp=1,*(pp+2)=3,pp[2]=3
        printf("pp:%p,pp+1:%p\n", pp, pp + 1); //pp:00AFFA98,pp+1:00AFFA9C    //相差sizeof(int)=4个字节大小
    
        printf("*b=%d,*(b+2)=%d,b[2]=%d\n", *b, *(b + 2), b[2]);        //*b=1,*(b+2)=3,b[2]=3   //与使用定义的指向数组的指针访问数组一样
        
        char* str = "helloworld";  //使用一个字符指针指向字符串常量,其实指向的是第一个字符'h'
        printf("*str=%c\n", *str);//*str=h
        int i, length;
    
        length = strlen(str);
        for (int i = 0; i < length; i++)
        {
            printf("%c", str[i]);
        }
        printf("\n");
        
        //统计字符串中字符个数
        char s[] = "helloworld";
        int count = 0;
    
        //while (*s++ != '\0')  //出错,因为字符串s的“helloworld”存储区常量区,s是常量不可修改
        //{
        //  count++;
        //}
        
        //修改如下
        char* ps = s;  //定义一个指针指向字符串“helloworld”,但此时ps是变量可修改
        while (*ps++ != '\0')  //++优先级高于*
        {
            count++;
        }
    
        printf("有%d个字符\n",count);  //有10个字符
    
        //指针数组(是数组)和数组指针(是指针)
        //int* p[](指针数组) 和int (*p)[](数组指针)   []优先级高于* 
        //如int* p[]中p[]首先是一个数组,数组中的元素类型为int* ,故为指针数组
        //int (*p)[]中首先(*p)定义其为一个指针,指向一个数组,数组重元素类型为int
    
        //********指针数组**********
        int m = 0, j = 1, k = 2;
        int* pa[3] = { &m,&j,&k };
    
        for (int i = 0; i < 3; i++)
        {
            printf("%p  %d\n", pa[i],*pa[i]);  //012FF820  0  存放的每个元素的地址,根据地址可找到对应的数
                                               //012FF814  1
                                               //012FF808  2
        }
        
        char* pStr[3] = { "hello",
                          "world",
                          "xian" };  //相当于实现二维数组
    
        for (int i = 0; i < 3; i++)
        {
            printf("%s\n", pStr[i]);   //hello
                                       //world
                                       //xian
        }
    
        //********数组指针**********(指向整个数组,而不是指向数组的第一个元素,与前面 int*pp=b区别开来)
        int tmp[3] = { 1,2,3 };
        int(*ap)[3] = &tmp;  //取得数组地址   因为数组名表示整个数组,本身就是地址,要指向整个数组,就需要指向这个地址,类似于二级指针
        //int(*ap)[3] = tmp;  //这样也可以,因为数组名就是数组的地址(&tmp==tmp),也是数组第一个元素的地址, 不建议这样写(与指向数组的指针int*p区别开)
        for (int i = 0; i < 3; i++)
        {
            //ap为& tmp,* ap为tmp,(*ap + i)指向数组第i个元素
            printf("%d\n", *(*ap + i));   //   1      
                                          //   2
                                          //   3     
        }
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:指针与数组

          本文链接:https://www.haomeiwen.com/subject/kaaxoltx.html