谷动谷力

标题: 【C语言】指针与数组名见怪不怪的写法,他们之间的区别 [打印本页]

作者: 鸣涧    时间: 2023-9-12 17:03
标题: 【C语言】指针与数组名见怪不怪的写法,他们之间的区别
【C语言】指针与数组名见怪不怪的写法,他们之间的区别

指针当数组名,下标法访问

经常我们在一些地方我们也可以看到类似的代码,能看到声明了一个数组变量和指针变量,指针变量指向了数组首地址,但是在通过指针访问数组时却是用的数组下标法来进行访问的。

以下我们来做个简单的例子:

  1. // 指针指向数组时,指针变量可以当成一个数组来使用
  2. #include <stdio.h>
  3. int main()
  4. {
  5.     int arr[3] = {1,2,3};
  6.     int *p =arr;
  7.     printf("%d\n",p[2]);
  8.     // 同样也能使用for循环来进行取值了
  9.     for(int i = 0;i<3;i++){
  10.         printf("%d\n",p);
  11.     }
  12.     return 0;
  13. }
复制代码

数组名当指针拿来加

当我们用指针的方式拿数组数值时,我们是不是可以使用*p++来取下一个位置的值,那我们将*p++改成*arr++到底行不行,我们可以试试。

  1. // 指针指向数组时,指针变量可以当成一个数组来使用
  2. #include <stdio.h>
  3. int main()
  4. {
  5.     int arr[3] = {1,2,3};
  6.     int *p =arr;
  7.     // 同样也能使用for循环来进行取值了
  8.     for(int i = 0;i<3;i++){
  9.         printf("%d\n",*p++);
  10.     }
  11.     for(int i = 0;i<3;i++){
  12.         printf("%d\n",*arr++);
  13.     }
  14.     return 0;
  15. }
复制代码

通过编译结果我们发现,这样子是不行的,原因其实很简单,涉及到常量指针和指针变量的概念

因为我们p 是一个指针变量,变量顾名思义就是可以存储可以变动的值。而p就是我们声明的一个指针变量,用于存放地址的变量。

而数组,他是一个常量指针,数组名代表的就是数组开头的地址。不能通过自增偏移来跳到下一个地址。

数组名与指针的区别

接下来我们来观察一下用sizeof函数数组名与指针的区别。

我们通过代码实验一下:

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int arr[3] = {1,2,3};
  5.     int *p =arr;
  6.     printf("sizeof arr is %d\n",sizeof(arr));
  7.     printf("sizeof p is %d\n",sizeof(p));
  8.     return 0;
  9. }
复制代码

结果我们可以看到虽然他们都是代表的同一个地址,但是通过sizefo得出的值却是不一样的。这是为什么呢。

数组名的sizeof显示出12呢是因为数组里面有三个元素,每个元素4个字节,相乘等于12.

而p的sizeof表示,用8个字节表示一个地址。他通过sizeof算出来的实际上效果与sizeof(int)算出来的结果是类似的。int的我们都知道一般是4个字节,当然不同编译器有点不同, int在16位编译器中占两个字节,int在32位编译器中占四个字节。

对此我们可以推测,不论是int *还是char *型的指针,都是占8个字节,我们来实验看看:

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int arr[3] = {1,2,3};
  5.     int *p =arr;
  6.     printf("sizeof arr is %d\n",sizeof(arr));
  7.     printf("sizeof p is %d\n",sizeof(p));
  8.     printf("sizeof p is %d\n",sizeof(int *));
  9.     printf("sizeof p is %d\n",sizeof(char *));
  10.     printf("sizeof p is %d\n",sizeof(double *));
  11.     return 0;
  12. }
复制代码

运行结果如下:

通过结果我们结论得到了验证。

总结

见怪不怪,指针可以当作数组名,通过下标法访问。数组名像指针一样拿来加也是可以的。

但是在++时不行,还有在sizeof中他们所代表的含义也是不一样的。


如果你希望我更新某个特定小知识,欢迎给我留言。






欢迎光临 谷动谷力 (http://bbs.sunsili.com/) Powered by Discuz! X3.2