示例程序:
#include <stdio.h>
main(int argc, char* argv[])
{
int x[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 987, 9, 9 } };
int(*p)[4] = x; printf("p[2][1] %d", p[2][1]);
printf("\nsizeof(p) is : %d \nsizeof(*p) is : %d\n", sizeof(p), sizeof(*p));
}
输出
p[2][1] 987
sizeof(p) is : 4
sizeof(*p) is : 16
在我的系统(和你的一样),int和指针都是32位的。因此,指针的大小为4,int的大小也为4。
首先,
p
是一个指针,而不是数组。它的大小是4,没有多余的部分。那就是你问题的答案。
现在,只是为了添加一些有用的信息:
p
是指向一个包含4个整数的数组的指针。
p
指向的内容的大小为4*4==16。(尝试将示例程序中的
int
更改为
short
,你会得到
sizeof(*p) is : 8
)
我可以分配
p=x
,因为类型正确,现在
p
包含x的地址,
p[0]
与
x[0]
相同(都是由4个整数组成的数组)。
p[2][3]
与
x[2][3]
和
*(p[2]+3)
相同。
p[2]
指向x的第2个元素,
p[2]+3
指向
x[2]
的第3个元素。(所有索引都从0开始)
std::vector
或std::array
代替C风格的数组。 - xtoflint *p[4]
是一个包含4 * (sizeof(int*))
个整型指针的数组,对吗?" - 是的。并且始终使用启用警告的编译选项 (-Wall -Wextra
) 进行编译。这样,在编译代码时,您将会注意到关于不兼容指针类型的警告信息。这将为您提供某些有问题的迹象。 - Spikatrixint *p[4]
vsint (*p)[4]
. 你标记了你的输出为size of *p
,但是却使用了sizeof(p)
(p是一个指针,在C语言中所有指针的大小都相同)...也许你应该尝试学习更多。 - edc65