二维数组地址和指向其第一个元素的对应指针

But*_*ver 3 c arrays pointers

就一维数组而言,其数组名称也是第一个元素的地址.所以可以将它分配给指针,如下所示:

char data[5];
char* p_data=data;
Run Code Online (Sandbox Code Playgroud)

所以我认为它应该与二维数组相同.数组名称应该是第一个元素地址的地址.所以,我想做这样的事情:

char data[5][5];
char** pp_data=data;
Run Code Online (Sandbox Code Playgroud)

然后我收到警告说指针类型char**与之不兼容char[ ][ ].

为什么会这样?我理解指针和数组概念错了吗?

Ste*_*mit 5

你是对的,数组通常由指向其第一个元素的指针引用.但是当你拥有"二维"阵列时

char data[5][5];
Run Code Online (Sandbox Code Playgroud)

你实际拥有的是一个数组数组.数组的第一个元素data是一个包含5个字符的数组.所以这段代码可行:

char (*pa_data)[5] = data;
Run Code Online (Sandbox Code Playgroud)

pa_data是一个指向数组指针.编译器不会抱怨它,但它实际上可能对您有用,也可能没有用.

确实,像你这样的指针指针char **pp_data可以像二维数组一样运行,但你必须做一些内存分配才能使它工作.事实证明,在阵列的阵列char data[5][5]没有指针TO- charpp_data是一个指针.(特别是,你不能说像pp_data = &data[0][0].)

另请参阅C FAQ列表中的此问题.