我很困惑这两个初始化之间的区别是什么:
int (*p)[10];
和
int *p[10]
我知道他们都可以指向2D数组,其行中的元素数是10 ....
答案 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数组的指针(第一种情况)。要访问特定的整数值,您需要取消引用指针然后下标结果,如
[]
同样,由于*
的优先级高于*
,因此我们需要使用括号将p
与p[i]
明确关联,而不是(*p)[i]
。表达式int
的类型为p
,因此int (*p)[10];
的声明为{{1}}。