了解数组就必须要在内存中分析数组的存在形式,数组的大小,数组类型以及数组元素的大小。C语言中知识点都是相关互相联系的,掌握以上之后,慢慢将数组与指针,数组与函数联系起来
void main()
{
//数组的定义,初始化,输出,大小(数组元素,类型),用途,数组在内存中的存在形式
int b[4][5] ;
//int(*p)[5] = b;
//二维数组的输出
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%5d,%x", b[i][j]=i*5+j,&b[i][j]);
}
printf("\n");
}
//理解二维数组从二维数组的大小,行指针,列指针去理解
//b[i]+j等价于&b[i][j],*(b[i]+j)等价于b[i][j]
printf("%d,%x\n", *(b[1] + 1), b[1] + 1);
printf("%d,%x\n", b[1][1], &b[1][1]);
//*b+1等价于&b[0][1],*(*b+1)等价于b[0][1]
//b+1等价于&b[1][0],*(*(b+1))等价于b[1][0]
int x = 2, y = 3;
printf("%d,%d,%d\n", b[x][y], *(b[x] + y), *(*(b + x) + y));
printf("%d,%x\n", *(*b + 1), *b + 1);//数组名作为一个常量指针,*b+1等价于&b[0][1];
printf("%d,%x\n", *(*(b + 1)), b + 1);//前面输出b[1][0],后面输出第二行一位数组的首地址即b[1][0]
printf("%d,%x\n", sizeof(*(b + 1)), b + 1);
//二维数组经典面试题,仔细理解行指针,列指针
printf("%d,%x\n", sizeof(**b), *b);//*b作为地址表示的是b[0][0]的地址,**b表示一个二维数组元素
printf("%d,%x\n", sizeof(*b), b);//b表示的是第一行b[0]的地址即行指针地址,*b表示的二维数组中的一行数组
printf("%d,%x\n", sizeof(*(&b)), &b);//&b表示的是二维数组的首地址,*(&b)表的是的整个二维数组的大小
system("pause");
}