【C语言】指针与数组名见怪不怪的写法,他们之间的区别
指针当数组名,下标法访问
经常我们在一些地方我们也可以看到类似的代码,能看到声明了一个数组变量和指针变量,指针变量指向了数组首地址,但是在通过指针访问数组时却是用的数组下标法来进行访问的。 以下我们来做个简单的例子:
- // 指针指向数组时,指针变量可以当成一个数组来使用
- #include <stdio.h>
- int main()
- {
- int arr[3] = {1,2,3};
- int *p =arr;
- printf("%d\n",p[2]);
- // 同样也能使用for循环来进行取值了
- for(int i = 0;i<3;i++){
- printf("%d\n",p);
- }
- return 0;
- }
复制代码
数组名当指针拿来加当我们用指针的方式拿数组数值时,我们是不是可以使用*p++来取下一个位置的值,那我们将*p++改成*arr++到底行不行,我们可以试试。 - // 指针指向数组时,指针变量可以当成一个数组来使用
- #include <stdio.h>
- int main()
- {
- int arr[3] = {1,2,3};
- int *p =arr;
- // 同样也能使用for循环来进行取值了
- for(int i = 0;i<3;i++){
- printf("%d\n",*p++);
- }
- for(int i = 0;i<3;i++){
- printf("%d\n",*arr++);
- }
- return 0;
- }
复制代码
通过编译结果我们发现,这样子是不行的,原因其实很简单,涉及到常量指针和指针变量的概念 因为我们p 是一个指针变量,变量顾名思义就是可以存储可以变动的值。而p就是我们声明的一个指针变量,用于存放地址的变量。 而数组,他是一个常量指针,数组名代表的就是数组开头的地址。不能通过自增偏移来跳到下一个地址。 数组名与指针的区别接下来我们来观察一下用sizeof函数数组名与指针的区别。 我们通过代码实验一下: - #include <stdio.h>
- int main()
- {
- int arr[3] = {1,2,3};
- int *p =arr;
- printf("sizeof arr is %d\n",sizeof(arr));
- printf("sizeof p is %d\n",sizeof(p));
- return 0;
- }
复制代码
结果我们可以看到虽然他们都是代表的同一个地址,但是通过sizefo得出的值却是不一样的。这是为什么呢。
数组名的sizeof显示出12呢是因为数组里面有三个元素,每个元素4个字节,相乘等于12. 而p的sizeof表示,用8个字节表示一个地址。他通过sizeof算出来的实际上效果与sizeof(int)算出来的结果是类似的。int的我们都知道一般是4个字节,当然不同编译器有点不同, int在16位编译器中占两个字节,int在32位编译器中占四个字节。 对此我们可以推测,不论是int *还是char *型的指针,都是占8个字节,我们来实验看看: - #include <stdio.h>
- int main()
- {
- int arr[3] = {1,2,3};
- int *p =arr;
- printf("sizeof arr is %d\n",sizeof(arr));
- printf("sizeof p is %d\n",sizeof(p));
- printf("sizeof p is %d\n",sizeof(int *));
- printf("sizeof p is %d\n",sizeof(char *));
- printf("sizeof p is %d\n",sizeof(double *));
- return 0;
- }
复制代码运行结果如下:
通过结果我们结论得到了验证。 总结见怪不怪,指针可以当作数组名,通过下标法访问。数组名像指针一样拿来加也是可以的。 但是在++时不行,还有在sizeof中他们所代表的含义也是不一样的。
如果你希望我更新某个特定小知识,欢迎给我留言。 |