C指针阵列初始化

时间:2011-07-21 15:48:04

标签: c pointers

我很困惑这两个初始化之间的区别是什么:

    int (*p)[10];

    int *p[10]

我知道他们都可以指向2D数组,其行中的元素数是10 ....

6 个答案:

答案 0 :(得分:4)

第一个是指向数组的指针,第二个是指针数组。

答案 1 :(得分:2)

在这里详细说明正确答案:

第一行:

 int (*p)[10];

声明“p”是指向容量为10 int的数组的内存地址的指针。它可以用英语读取:“整数指针'p'指向内存中的10个连续整数”。

第二行:

int *p[10]

声明“p []”是一个包含10个整数指针的数组。这是一个指向整数的内存地址数组。在这种情况下,“p”是内存中10个指针的序列(恰好是其他整数的内存地址)。

答案 2 :(得分:2)

int (*p)[10];


+------+                           +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|  p   | =========================>|(*p)[0]|(*p)[1]|(*p)[2]|(*p)[3]|(*p)[4]|(*p)[5]|(*p)[6]|(*p)[7]|(*p)[8]|(*p)[9]|
+------+                           +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+

sizeof p将返回sizeof (void *)(32位系统上4位,64位系统上8位)

sizeof *p将返回10*sizeof (int)(大多数系统上为40)

int *p[10];   is the same as     int* (p[10]);   

p
+------+------+------+------+------+------+------+------+------+------+
| p[0] | p[1] | p[2] | p[3] | p[4] | p[5] | p[6] | p[7] | p[8] | p[9] |
+------+------+------+------+------+------+------+------+------+------+

sizeof p将返回10*sizeof (void *)(32位系统上40位,64位系统上80位)

sizeof *p将返回sizeof (int *)(32位系统上4位,64位系统上8位)

答案 3 :(得分:1)

在第一个例子中,p是指向10个整数数组的指针。在第二个例子中,p是一个包含10个指针的数组。

您可以按如下方式动态分配类型为“十个int数组的指针”的对象。

int (**ptr)[10] = new (int (*)[10]);

注意,没有分配任何整数的空间;只有指针本身。

您可以按如下方式分配10个整数的数组:

int *ptr = new int[10];

你不能做的事情(没有显式转换)是将指向动态分配的10 int数组的指针分配给类型为int (*)[10]的指针。无论何时通过new分配数组,即使使用typedef,新表达式的类型也是指向数组第一个元素的指针;数组的大小不会保留在新表达式的类型中。

这是因为new[]表达式可以分配在运行时选择数组大小的数组,因此并不总是可以(或者甚至可能)将数组大小编码为新表达式的类型。 / p>

如上所述,您可以动态分配一个10 int的数组。第一个数组的大小从类型信息中丢失,你得到的是指向四个数组的数组(大小为1)的第一个元素的指针。

int (*p)[10] = new int[1][10];

即使它是一个只有1的数组(10 int的数组),你仍然需要使用delete[]来解除分配p

delete[] p;

当然,实际上永远不应该需要手动调用删除。

答案 4 :(得分:0)

在第一个定义(不是初始化)中,p是一个指针;在第二个中,p是一个包含10个指针的数组。

答案 5 :(得分:0)

正如其他人所指出的那样,int (*p)[10]p声明为指向int的10个元素数组的指针,而int *p[10]p声明为int指向p的10元素指针数组。

在C语言中,声明是围绕表达式的类型构建的,而不是对象。我们的想法是声明的形式应该与表达式的形式相匹配,因为它在代码中使用。

假设int是指向x = *p[i]; 的指针数组(第二种情况)。要访问特定的整数值,您可以下标到数组中并取消引用结果,如

[]

()*等后缀运算符的优先级高于*(p[i])等一元运算符,因此上述语句被解析为*(IOW,p[i] }应用于表达式*p[i])。

表达式 int的类型为p,因此int *p[10];的相应声明为p

现在让我们假设x = (*p)[i]; 是指向int数组的指针(第一种情况)。要访问特定的整数值,您需要取消引用指针然后下标结果,如

[]

同样,由于*的优先级高于*,因此我们需要使用括号将pp[i]明确关联,而不是(*p)[i]。表达式int的类型为p,因此int (*p)[10];的声明为{{1}}。