复杂类型(一) int *p[10]与int (*p)[10]的区别

 这两天在学习一些基本复杂类型的确认方法,整理了一下思路及写下一些心得。现在让我们一起来看看 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为准)

 

 

posted @ 2014-03-29 12:54 这夏 阅读(...) 评论(...) 编辑 收藏