指针和数组的区别

来源:互联网 发布:计算机前沿技术大数据 编辑:程序博客网 时间:2024/06/08 15:38

在一个项目中定义两个文件

//a.cppint  a[3] = { 1, 2, 3 };

//b.cpp#include<stdio.h>extern int *a;//引用a.cpp的数组名a,但是不把它当数组而是当成指针void main(){printf("%d\n", a);printf("%d\n", a + 1);printf("%d\n", *a);getchar();}
请问打印的结果是什么???

不用猜了,让我告诉你答案吧。

printf("%d\n", a);

//编译器看来a就是指针,按照指针进行操作。打印其指向的地址,因为指针的大小在32位中是固定大小4字节,所以从a首地址中取4个字节,这里因为数组的每个元素的大小刚好是4个字节,如果不是int数组的话,要考虑下大小端的问题。所以这里是取a[0]的值,最后打印a[0]。也就是说编译器把a[0]看成了一个地址。

printf("%d\n", a + 1);

//编译器上看a是指针,+1是按照int*指针进行加1操作,因为int*的指针每加一就是加4个字节,所以最后打印a[0]+4的值,编译器看来这还是一个地址值。

printf("%d\n", *a);

//解引用即把a保存的地址进行解引用操作。结合第一个问题最后等价于*a[0]  产出程序崩溃,因为解引用了一个保留的内存,被操作系统拒绝

总结:指针就是指针,数组就是数组。两者不可以混用,把指针当数组或者把数组当指针,不然产生意想不到的错误。



原创粉丝点击