数组名是数组首地址吗?
char str[3][5] = { {'h','e','l','l','o'},
{'w','o','r','l','d'},
{'y','y','y','y','\0'} };
//.二维数组列表初始化的字符串数组没加‘\0’的话就只是字符数组
printf("str为%p,%s\n",str,str);
printf("str为%p,%s\n",&str[0][0],&str[0][0]);
printf("&str为%p,%s\n",&str,&str);
//%s是打印字符串到/0结束
//三者完全相同,说明地址值:str==&str[0][0]==&str为数组的首元素地址
printf("str为%p,%c\n",str,*str);
printf("str为%p,%c\n",&str[0][0],str[0][0]);
printf("&str为%p,%c\n",&str,*(&str));
//发现用%c打印数组首元素,理论上&str[0][0]与str完全等价,但这里str[0][0]可以正确打印,而*str不行。说明它们之间是有区别的。
printf("str为%p,%c\n",str,**str);
printf("str为%p,%c\n",&str[0][0],str[0][0]);
printf("&str为%p,%c\n",&str,***(&str));
//str[0][0]与**str打印结果相同,说明str在这里是表示整个数组的地址,而不是数组首地址。
再看一个例子
//会有警告:传参类型不匹配,说明数组指针的值类型应该是整个数组的地址,而不是数组首地址
结论
整个数组的地址&a与数组元素首地址a在地址值上是相同的,但表达含义并不同。
理论上数组名一般都表示数组元素首地址,但有几种情况表整个数组的地址
1.数组定义 2.&a 3.sizeof 4.%c...其他情况