• C语言指向数组元素的指针变量的定义和赋值


    一、指向数组元素的指针变量的定义和赋值

           数组指针 是指 数组的开始地址,数组元素的指针 就是数组元素的地址

    1. int a[5]; //能引用的是:a[0]-a[4],只要是数组,那么数组元素的内存一定是挨着的。
    2. a[0]=5; //数组名 a的地址 就等于 a[0]的地址;数组名代表数组的首地址。
    3. a[1]=6;
    4. a[2]=7;
    5. a[3]=8;
    6. a[4]=9;
    7. int *p; //指针变量,整形指针变量,和数组a类型相同。
    8. p=&a[0]; // 把a[0]元素的地址赋给指针变量p,即p指向数组第0号元素;这里等价于 p=a;
    定义指针变量时也可以给指针变量 赋予初值
    int *p=&a[0];   //等价于 int *p; p=&a[0]; 这两行语句。
    二、通过指针引用数组元素
    (1) *p=19;    //相当于a[0]=19;
    (2) p=p+1  //并不是简单的+1,取决于p的类型,是整型的话就加4;例如:p=1000,p+1=1004;
    (3) p+i  或者 a+i 是什么意思  (i 是数组元素的下标 0-4)
    假如:现在p指向数组首地址,a是数组名(代表数组首地址),那么p+i 或者 a+i 就是数组元素 a[i] 的地址,也就是说它们指向了数组a的第 i 个元素。就是说 p+3 和 a+3 的值,&a[3],也就是都指向 a[3],a +3*4=1012。
    结论:p+i 或者 a+i ,都是地址,既然是地址,就可以赋给指针变量。
    (4) *(p+i)  或者 *(a+i)         //这里的 a 表示数组的首地址
    有了上面(3)自然知道(4),这两个是 p+i 或者 a+i 所指向的数组元素,也就是a[i],比如:*(p+2) 或者 *(a+2)就是a[2].
    (5) p[i]   //(i是数组元素的下标 0-4)
    因为p是指向数组首地址,所以 p[i]  等价于 *(p+i),也就是跟 a[i]等价
    所以引用数组元素有很多方法:
    a[i];  p[i];  *(p+i);   *(a+i);
    1. #include
    2. int main()
    3. {
    4. int a[5];
    5. int *p;
    6. int i;
    7. a[0]=12;
    8. a[1]=14;
    9. a[2]=20;
    10. a[3]=18;
    11. a[4]=50;
    12. for(i=0;i<5;i++)
    13. {
    14. printf("%d\n",a[i]);
    15. }
    16. printf("-----------------------------\n");
    17. for(i=0;i<5;i++)
    18. {
    19. printf("%d\n",*(a+i));
    20. }
    21. printf("-----------------------------\n");
    22. for(p=a;p<(a+5);p++) //p 指向 a(数组首地址),指针变量p小于地址(a+5),指针变量p ++
    23. {
    24. printf("%d\n",*p); //p 的地址不同,*p指向的变量也不一样。每次都取p存的地址的值
    25. }
    26. }

    注意事项:

    (a) 数组首地址 a,不可以进行 a++;

    (b) p可以指向数组元素以外的内存地址,但是不可以使用这个地址,因为不属于你,你不能操作。

    (6) *p++ 

    优先级相同,并且都是从右到左的结合性,所以 *(p++)

    p++是先用后加,所以*(p++)整个作用是:得到p 指向的变量的值(*p),然后再使p指针自加1,指向下一个数组元素。

     

    1. 以进行 a++;
    2. (b) p可以指向数组元素以外的内存地址,但是不可以使用这个地址,因为不属于你,你不能操作。
    3. (6) *p++
    4. 优先级相同,并且都是从右到左的结合性,所以 *(p++)
    5. p++是先用后加,所以*(p++)整个作用是:得到p 指向的变量的值(*p),然后再使p指针自加1,指向下一个数组元素。
    6. #include
    7. int main()
    8. {
    9. int a[5];
    10. int *p;
    11. a[0]=12;
    12. a[1]=14;
    13. a[2]=20;
    14. a[3]=18;
    15. a[4]=50;
    16. p=a;
    17. printf("%d\n",*p++); //因为先用后加,先输出 a[0]的值12,然后p指向了a[1]
    18. printf("%d\n",*p); //因为上面p++了,所以得到的结果就是:a[1]的值。14
    19. }

    (7) *++p    //这里和上面使完全不同的,因为++p是先加后用;先p+1,然后再取用p指向的变量。

     printf("%d\n",*++p);  //先打印a[1]的值14,然后p指向了a[1]

    (8) (*p)++    //表示p所指向的元素加1,如果p指向的数组首地址,那么就等价于 a[0]++,实际上就是数组元素值+1,不是指针加一。

  • 相关阅读:
    uview 组件 u-form-item 点击事件
    详解 QT 多线程 TCP 文件接收实例
    国庆作业2
    设计模式:中介者模式
    Python零基础入门
    MySQL语句复杂业务场景解决案例
    WebRTC系列补充--native重采样
    LeetCode //C - 295. Find Median from Data Stream
    ERP库存管理 华夏
    Java中整数基础知识
  • 原文地址:https://blog.csdn.net/qq_48516121/article/details/126918560