我在搞乱多维数组和指针。我一直在研究一个打印出简单数组的内容和地址的程序。这是我的数组声明:
int zippo[4][2] = { {2,4},
{6,8},
{1,3},
{5,7} };
我目前的理解是 zippo
是一个指针,它可以保存几个其他指针的地址。默认情况下,zippo
保存指针zippo[0]
的地址,也可以保存指针zippo[1]
的地址,zippo[2]
和 zippo[3]
.
现在,采取以下陈述:
printf("zippo[0] = %p\n", zippo[0]);
printf(" *zippo = %p\n", *zippo);
printf(" zippo = %p\n", zippo);
在我的机器上,输出如下:
zippo[0] = 0x7fff170e2230
*zippo = 0x7fff170e2230
zippo = 0x7fff170e2230
我完全理解为什么 zippo[0]
和 *zippo
具有相同的值。它们都是指针,它们都存储整数 2 的地址(默认情况下),即 zippo[0][0]
。但是 zippo
也共享相同的内存地址是怎么回事? zippo
不应该存储指针 zippo[0]
的地址吗?什么?
最佳答案
当数组表达式出现在大多数上下文中时,它的类型会隐式地从“T 的 N 元素数组”转换为“指向 T 的指针”,并将其值设置为指向数组中的第一个元素。此规则的异常(exception)情况是当数组表达式是 sizeof
或地址 (&
) 运算符的操作数时,或者当数组是正在使用的字符串文字时作为声明中的初始化器。
因此,表达式 zippo
从 int [4][2]
类型(int 的 2 元素数组的 4 元素数组)“衰减”到 int (*)[2]
(指向 2 元素 int 数组的指针)。类似地,zippo[0]
的类型为int [2]
,隐式转换为int *
。
鉴于声明 int zippo[4][2]
,下表显示了涉及 zippo 的各种数组表达式的类型以及任何隐式转换:
Expression Type Implicitly converted to Equivalent expression ---------- ---- ----------------------- --------------------- zippo int [4][2] int (*)[2] &zippo int (*)[4][2] *zippo int [2] int * zippo[0] zippo[i] int [2] int * &zippo[i] int (*)[2] *zippo[i] int zippo[i][0] zippo[i][j] int &zippo[i][j] int * *zippo[i][j] invalid
注意 zippo
、&zippo
、*zippo
、zippo[0]
、&zippo[ 0]
和 &zippo[0][0]
都具有相同的值;它们都指向数组的基数(数组的地址与数组的第一个元素的地址相同)。但是,各种表达式的类型都不同。
关于c - C多维数组中的指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2003745/