这两天在学习一些基本复杂类型的确认方法,整理了一下思路及写下一些心得。现在让我们一起来看看 int *p[10]与int (*q)[10]这两个形似心不同的东西的究竟是有一些什么样的不同。
1、首先让我们先来看看这两个变量所占的字节数吧
int _tmain(int argc, _TCHAR* argv[]) { int *p[10]; int (*q)[10]; printf("%ld %ld\n",sizeof(p),sizeof(q)); return 0; }
调试后发现分别占的字节为:
是不是非常神奇呢,现在让我们一起去一点点发现他们之间的小秘密吧。
2 确认方法
当我们声明一 int *p;是我们知道 这是一个指针,该指针是指向一个int 类型的变量。
那我们是怎么来确定的呢?
a、我们声明的是变量p而不是变量*p。(这一点很重要)
b、变量p离*最近,从而我们确定变量p是一个指针。
c、我们将*p看作一个整体 则就成了 int A,是一个整形变量。从而我们确定变量p的指向是int类型的变量。
3、同样的复杂类型也是遵循这个方法的
(1)现在让我们来看看int *p[10]吧。
a、首先我们声明一个变量p。
b、我们要确定票p究竟是跟*靠的近一些还是跟[]靠的近,这里要用到优先级。我们知道 对于一个数组int a[10],访问该数组中的第i个元素可以写成
a[i]或者*(a+i),从这里知道[]与取*操作时等效的即他们俩是平级,平级在优先级中是遵循向右看齐的原则。
所以p是离[]近,到此 我们可以确定p是一个数组,他有10个元素。
c、将p[10]看作一个整体的的到 int *A;可知道数组p中的每一个元素是指向一个int 类型的变量的指针。
d、总结:int *p[10]是一个指向整形变量的指针数组。
这样就能解释我们上面计算p的字节数是40了,p是一个指向整形变量的指针数组 所以他的字节数为4*10=40(注意:这里有些编译器分配给指针为8字节,我以为当前用的visual studio 2012为准);
(2)再让我们来看看 int(* q)[10]吧
a、我们声明了一个变量q。
b、由于有()所以q离 *近,可以确定变量q是一个指针。
c、我们把(*q)看成一个整体得 int A[10], 到此我们可以确定 q是一个指向一个int类型的数组的指针。
d、总结:int(* q)[10]是指向一个数组的指针,即数组指针。
既然q是一个指针那么他的字节数就是4(注意:这里有些编译器分配给指针为8字节,我以为当前用的visual studio 2012为准)
复杂类型(一) int *p[10]与int (*p)[10]的区别,布布扣,bubuko.com
复杂类型(一) int *p[10]与int (*p)[10]的区别
原文:http://www.cnblogs.com/showCode/p/3632394.html