二维数组作为形参时退化为指针
void printA(char a[3][4])
{
printf("形参中的数组a退化为指针= %d\n", sizeof(a));
}
*a : 代表第0行首地址
a+i 等价于 &a[i] : 代表第i行首地址
(a+i) 等价于 a[i] : 代表第0行首元素地址
(a+i)+j 等价于 &a[i][j]: 代表第i行第j列元素的地址
((a+i)+j) 等价于 a[i][j] = 代表第i行第j列元素的值
printf("%p, %p\n", a, a + 1); //a代表首行地址
printf("%p, %p\n", *(a + 0), *(a + 0) + 1); //*(a+0)代表首行首元素地址
printf("%p\n",*(a + 0) + 1); //第i行第j列元素的地址
printf("%c\n", *(*(a + 0) + 0)); //第i行第j列元素的值
测试代码 |
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printA(char a[3][4])
{
printf("形参中的数组a退化为指针= %d\n", sizeof(a));
}
int main(void)
{
// char a[3][4] = { '1', '2', '3', '\0', '4', '5', '6', '\0', '7', '8', '9', '\0'};
char a[][4] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'} };
int n = sizeof(a) / sizeof(a[0]); //二维数组行数
int m = sizeof(a[0]); //二维数组列数
printf("m = %d, n = %d\n", m, n);
printf("实际数组a大小 = %d\n", sizeof(a));
printA(a);
printf("%p, %p\n", a, a + 1); //a代表首行地址
printf("%p, %p\n", *(a + 0), *(a + 0) + 1); //*(a+0)代表首行首元素地址
printf("%p\n",*(a + 0) + 1); //第i行第j列元素的地址
printf("%c\n", *(*(a + 0) + 0)); //第i行第j列元素的值
int i = 0;
for (i = 0; i < n; i++) //二维数组按行输出
{
printf("%s\n", a[i]);
}
printf("\n");
system("pause");
return 0;
}