指针数组的大小

时间:2011-12-20 07:39:59

标签: c arrays sizeof

我对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认为两者都指向相同大小的数组?

6 个答案:

答案 0 :(得分:8)

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

#include <stdio.h>

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     |
|_____________________|

答案 1 :(得分:5)

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

编辑(澄清):

代码段1,你抓住了数组的大小。

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

答案 2 :(得分:2)

检查此代码:

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

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

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

答案 3 :(得分:2)

在第一段代码中:

int p[10];

p没有指向一组int; p 一组int。在声明中

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部分。

答案 4 :(得分:0)

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

   10*4=40

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

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

答案 5 :(得分:0)

在第一个代码中,sizeof(Array)将返回给您分配给该数组的字节总数。您可以通过

获得正确的数组大小
int size= sizeof(Array)/sizeof(Array[0]);

与第二个代码一样,它返回指针的大小。

相关问题