这里先给出程序:
#include <stdio.h>
int main(int argc, const char *argv[])
{
char c[2][2];
printf("c=%p\t*c=%p\t&c=%p\n\r",c,*c,&c);
printf("c+1=%p\t*c+1=%p\t&c+1=%p\n\r",c+1,*c+1,&c+1);
printf("c[0]=%p\t&c[0]=%p\t&c[0][0]=%p\n\r",c[0],&c[0],&c[0][0]);
printf("c[0]+1=%p\t&c[0]+1=%p\t&c[0][0]+1=%p\n\r",c[0]+1,&c[0]+1,&c[0][0]+1);
return 0;
}
结果:
- 从结果我们可以通过加一之后的地址值来判断二维数组名
c
与*
、&
、[ ]
组合之后要表达的意思。 - 这里的数组元素类型是
char
型的,也就是每个数组元素占用一个字节的数据。 c
加1
之后地址变成0x7fff75f8e8c6,
与不加1相比移动了两个字节的数据,所以这里c表示的是第一维整个数组的首地址,第一维数组有两个数组元素,移动的单位为2*sizeof(char)
,所以这里的加1实际是以两个字节为单位来加一的。*c
加一后地址变成0x7fff75f8e8c5
,移动了一个字节大小的数据,所以这里的*c
表示的是第一维数组首元素的地址。&c
加一后地址变成0x7fff75f8e8c8
,移动了四个字节的数据,所以这里的&c
表示的是二维整个数组的的首地址。- 还要注意的是:二维数组名是一个地址常量
还有其他的形式以下图列出: