main()
{
char str[][3]={"ab","cd","ef","gh"};
printf("\n%s\n%s",str[2][0],&str[0][0]);
//WHY WE NEED TO PUT "&" TO PRINT &str[2][0] the element.
}
//虽然这可以正常使用
main()
{
char str[][3]={"ab","cd","ef","gh"};
printf("\n%s\n%s",str[2],&str[0]);
}
答案 0 :(得分:4)
str [2]是数组str
的第三个元素。它又是一个类型为char[3]
的字符数组。在像这样的函数调用中
printf( "%s", str[2] );
将数组转换为指向其第一个字符(元素)的指针。数组str[2]
的第一个字符可以像str[2][0]
一样获得。所以它的地址确定为&str[2][0]
。
因此,表达式str[2]
和&str[2][0]
是等效的。
至于这个电话
printf("\n%s\n%s",str[2],&str[0]);
然后它无效。格式说明符%s
期望参数类型为char *
,而表达式&str[0]
的类型为char **
。但是因为在任何情况下,表达式&str[0]
的值都是数组str[0]
的第一个元素的地址,该函数会产生正确的结果。
如果您只想输出单个字符而不是字符串,则必须使用格式说明符%c
例如
printf("\n%c\n%s",str[2][0],&str[0][0]);
^^^
在此函数调用中,str[2][0]
是单个字符,然后使用格式说明符%c作为其输出。