int *p[10]与int (*p)[10]的区别

雨点打透心脏的1/2处 2022-08-09 12:46 356阅读 0赞

这两天在学习一些基本复杂类型的确认方法,整理了一下思路及写下一些心得。现在让我们一起来看看 int *p[10]与int (*q)[10]这两个形似心不同的东西的究竟是有一些什么样的不同。

1、首先让我们先来看看这两个变量所占的字节数吧

复制代码

  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3. int *p[10];
  4. int (*q)[10];
  5. printf("%ld %ld\n",sizeof(p),sizeof(q));
  6. return 0;
  7. }

复制代码

调试后发现分别占的字节为:

291119157199030.jpg

是不是非常神奇呢,现在让我们一起去一点点发现他们之间的小秘密吧。

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为准)

发表评论

表情:
评论列表 (有 0 条评论,356人围观)

还没有评论,来说两句吧...

相关阅读

    相关 int* p 还是 int *p

    是int\ p 还是 int \p? 作为一个有强迫症的初学者,是一定要搞个明白的,毕竟在看别人的代码时,写前者的多,写后者的不少,竟然还有些人一会儿写前者,一会儿写后者。

    相关 int *p=a和int *p=&a区别

      指针变量用来存放指针(或者可以理解成地址)。而 & 则是取地址运算符,因此给指针变量赋值的方式一般是把变量的地址取出来,然后付给对应类型的指针变量: int a;

    相关 int pint p

    1. int(\p)\[10\]: 根据运算符的结合律,()的优先级最高,所以p是一个指针,指向的一个维度为10的一维数组。 p一个指向数组的某一行 int a[