- void main()
- {
- int a[2][2]={1,2,3,4};//这是一个2*2的二维数组
- int (*p)[2];//数组指针
- p=a;//令p指向数组a
- printf("%d\n%d\n",sizeof a,sizeof p);
- }
猜一猜输出是什么?
困惑了吗?为什么结果会是这样的呢,让我们先初步了解一下sizeof关键字吧,下面是MSDN上sizeof的说明:
当sizeof用于变量时返回这个变量占用的实际空间的大小。当sizeof用于数组名时,返回整个数组的大小(这里的大小指占用的字节数)。p是一个指针变量,这个变量占用四个字节。而a是数组名,所以sizeof a返回数组a中的全部元素占用的字节数。
了解了sizeof,猜猜下面这段代码输出什么
- <strong>#include<stdio.h>
- void main()
- {
- int a[2][2]={1,2,3,4};//这是一个2*2的二维数组
- int (*p)[2];//数组指针
- p=a;//令p指向数组a
- printf("%d\n%d\n",sizeof(a+1),sizeof(p+1));
- printf("%d\n%d\n",sizeof(a+0),sizeof(p+0));
- }
运行结果:
从结果中看出,a在做+运算时是转化成了指针变量,此时a+i的类型是一个指针变量,而不是一个数组名。但a[i]是一个一维数组的数组名,sizeof(a[0])的值是8。
现在再来看一段代码:
- #include<stdio.h>
- void f(int a[][2])
- {
- printf("%d\n",sizeof a);
- }
- void main()
- {
- int a[2][2]={1,2,3,4};//这是一个2*2的二维数组
- printf("%d\n",sizeof a);
- f(a);
- }
再猜一下输出是什么?
是不是又有点困惑呢?
解释:这是因为传参的时候数组名转化成指针变量,注意到函数f中f(int a[][2])这里并不需要指定二维数组的长度,此处可以改为int (*a)[2]。所以传过来的就是一个数组指针变量。这样明白了吧!
总结:数组名的类型是指向元素类型的指针,值是指针常量。(a+1)的类型是一个指针变量。把数组名作为参数传递的时候实际上传递的是一个指针变量。sizeof对变量和数组名操作时返回的结果会不一样。数组指针是指向数组的指针,其值可以是变量。