以下是指针与数组关系的事例代码,帮助理解
#include
#define DEBUG 1
#if DEBUG
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int b[2][3] = {{1, 2, 3}, {4, 5, 6}};
/*一维数组*/
printf("*a is %x\n", *a); //一维数组的首地址中的值为1,
printf("a is %x\n", a); //一维数组的首地址
printf("&a is %x\n", &a); //一维数组的首地址,读取方式为一维数组大下
printf("(&a)+1 is %x\n", (&a) + 1); //一维数组的首地址
printf("a[0] is %x\n", a[0]); //一维数组的首元素
printf("&a[0] is %x\n", &a[0]); //首元素的地址
printf("a+0 is %x\n", a + 0); //a是数组名,是一个一级指针常量
printf("a+1 is %x\n", a + 1); //a的读取方式为一个int的大小
printf("\n");
/*二维数组*/
printf("**b is %p\n", **b); //二维数组的首元素的值
printf("*b is %p\n", *b); //二维数组第0行(一维数组)一维数组首元素的地址
printf("b is %p\n", b); //b是一个二级常量指针
printf("&b is %p\n", (&b)); //读取方式为一个二维数组大小
printf("(&b)+1 is %p\n", (&b) + 1);
printf("(*b)+1 is %p\n", (*b) + 1); //二维数组第0行(一维数组)第二个元素地址
printf("b is %p\n", b); //b是一个二级常量指针,读取方式为一行
printf("b+1 is %p\n", b + 1); //二维数组第1行(一维数组)元素地址
printf("\n");
printf("&b[0] is %p\n", &b[0]); //二维数组第0行(一维数组)一维数组首元素的地址,读取方式为一行元素
//printf("&(&(b[0])) is %p\n", &(&(b[0])));//error: lvalue required as unary '&' operand
printf("(&b[0])+1 is %p\n", (&b[0]) + 1); //二维数组第1行(一维数组)一维数组首元素的地址
printf("b[0] is %p\n", b[0]); //读取方式为一个int元素
printf("b[0]+1 is %p\n", b[0] + 1);
printf("\n");
printf("*b[0] is %p\n", *b[0]);
printf("*(b[0]+1) is %p\n", *(b[0] + 1));
printf("\n");
printf("b[0][0] is %p\n", b[0][0]);
printf("&b[0][0] is %p\n", &b[0][0]); //读取方式为一个int大小
printf("(&b[0][0])+1 is %p\n", (&b[0][0]) + 1);
return 0;
}
#endif