int stud[5][2] = {{1,2},{3,4},{5,6},{7,8},{9,8}};
printf("%u %u",*(stud+1),stud+1);
printf("%u, %u", &stud,stud);
为什么这个语句打印出相似的值,stud[1] 或 *(stud+1) 实际上是一个数组因此必须得到基地址即 &stud[0][0],但 stud 本身是一个指向数组的指针大批。第三条语句也打印相同的值。
最佳答案
关于表达式都是地址结果,您的观察是正确的。但是根据标准,这些地址的类型是不同的。您的短语“但 stud 本身是指向数组数组的指针”。不准确。 stud
是一个数组的数组。指针不是数组。经过几十年的努力,想出一个描述它如何工作的坚实的白话,并坚定地拒绝走“衰变”木板(这个词在 C 标准中出现了一次次,甚至在那里它用作动词脚注),我能想到的最好的是:
Pointers are not arrays. A pointer holds an address. An array is an address.
每个表达式如下所示 Given int stud[5][2];
stud int (*)[2]
stud+1 int (*)[2]
*(stud+1) int *
&stud int (*)[5][2]
请记住,根据标准,数组的表达值是其第一个元素的地址,元素类型指针是所述地址的类型。在两个输出中,每对表达式都有相同的地址,但它们是不同的类型。这可以通过对原始代码进行一些扩展来验证:
#include <stdio.h>
int main()
{
int stud[5][2] = {{1,2},{3,4},{5,6},{7,8},{9,8}};
printf("%p %p\n", *(stud+1), stud+1);
printf("%p %p\n", &stud,stud);
int (*p1)[2] = stud+1; // OK
// int (*p2)[2] = *(stud+1); // incompatible types
int *p3 = *(stud+1); // OK
int (*p4)[5][2] = &stud; // OK
return 0;
}
关于c - 二维数组和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23840904/