指针数组的大小

我对sizeof运营商有疑问

代码1:

int main() { int p[10]; printf("%d",sizeof(p)); //output -- 40 return 0; } 

代码2:

 int main() { int *p[10]; printf("%d",sizeof(*p)); //output -- 4 return 0; } 

在第一个代码中,p指向一个int数组。 在第二个代码中,p指向一个指针数组。 我无法理解为什么第一个代码o / p是40但第二个代码o / p是4认为两者都指向相同大小的数组?

以下程序的输出将为您提供有关类型大小和类型指针的一些提示和理解。

 #include  int main(void) { int p1[10]; int *p2[10]; int (*p3)[10]; printf("sizeof(int) = %d\n", (int)sizeof(int)); printf("sizeof(int *) = %d\n", (int)sizeof(int *)); printf("sizeof(p1) = %d\n", (int)sizeof(p1)); printf("sizeof(p2) = %d\n", (int)sizeof(p2)); printf("sizeof(p3) = %d\n", (int)sizeof(p3)); return 0; } int p[10]; => 10 consecutive memory blocks (each can store data of type int) are allocated and named as p int *p[10]; => 10 consecutive memory blocks (each can store data of type int *) are allocated and named as p int (*p)[10]; => p is a pointer to an array of 10 consecutive memory blocks (each can store data of type int) 

现在回答你的问题:

 >> in the first code p points to an array of ints. >> in the second code p points to an array of pointers. 

你是对的。 在代码中:2,要获得p指向的数组的大小,需要传递基址

 printf("%d", (int)sizeof(p)); 

而不是以下

 printf("%d", (int)sizeof(*p)); //output -- 4 

以下是等效的:

 *p, *(p+0), *(0+p), p[0] 

 >> what's the difference between p[10] and >> (*p)[10]...they appear same to me...plz explain 

以下是您的其他问题的答案:

 int p[10]; _________________________________________ | 0 | 1 | 2 | | 9 | | (int) | (int) | (int) | ... | (int) | |_______|_______|_______|_________|_______| int (*p)[10] _____________________ | | | pointer to array of | | 10 integers | |_____________________| 

基本上,你有一个指针数组。 当您执行*p ,您取消引用指向数组的第一个元素的指针。 因此,类型将是int。 sizeof(int*)恰好是你机器上的4。

编辑(澄清):

代码片段1,你正在抓住数组的大小。

代码片段2,您将获取指针数组的第一个元素指向的类型的大小。

检查此代码:

在这段代码中,p指向一个指针数组,因此o / p为40

在你的情况下,它是一个指针数组,所以o / p是4

 #include int main() { int (*p)[10]; printf("%d",sizeof(*p)); //output -- 40 return 0; } 

在第一个代码中:

 int p[10]; 

p不指向一组int; p 一个整数数组。 在声明中

 printf("%d",sizeof(p)); 

应该是

 printf("%d", (int)sizeof(p)); 

表达式p仍然引用数组对象,因此sizeof(p)产生数组对象的大小,在系统上恰好是40个字节( 10 * sizeof (int) )。

在第二:

 int *p[10]; 

再一次, p 一个指针数组。 但在以下声明中:

 printf("%d", (int)sizeof(*p)); 

表达式p被转换为指向数组的第一个元素的指针( 而不是整个数组)。 取消引用该指针(使用一元*运算符)会得到一个int*对象,即数组的第一个元素。 系统上int*指针的大小恰好是4.( sizeof (int)sizeof (int*)不一定相同;它们发生在你的系统上。)

在C中,规则是数组类型的任何表达式(例如数组变量的名称)都会自动转换为指向数组第一个元素的指针 – 大多数时候 。 有三个例外:

  • 当它是sizeof的操作数时( sizeof arr产生数组对象的大小,而不是指针的大小)
  • 当它是一元的操作数&&arr产生整个数组对象的地址,而不是它的第一个元素的地址;相同的内存位置,不同的类型)
  • 当它是初始化器中用于初始化数组对象的字符串文字时( int arr[6] = "hello";不将"hello"转换为指针,它会复制数组)。

强烈推荐阅读: comp.lang.c FAQ的第6部分。

查看你的第一个代码片段p是大小为40字节的数组。现在它是如何40字节很简单,数组p确实包含10个成员,每个成员大小为4字节

  10*4=40 

在第二个代码片段中,p只是它的指针数组,意味着该数组的每个成员都是一个指向int值的指针.Now * p表示数组第一个下标的值,这个值只是一个4字节的地址。

希望现在的事情会很清楚。