C编程-字符数组与字符串数组寻址消歧

C编程-字符数组与字符串数组寻址消歧,c,arrays,pointers,char,c-strings,C,Arrays,Pointers,Char,C Strings,印刷品: char contents[8][2]={"1","2","3","4","5","6","7","8"}; char* contentsx[8]={"1","2","3","4","5","6","7","8"}; printf("Contents: %s\n", contents[1]); printf("Contents: %s\n", &contents[1]); printf("Contentsx: %s\n", contentsx[1]); printf("Con

印刷品:

char contents[8][2]={"1","2","3","4","5","6","7","8"};
char* contentsx[8]={"1","2","3","4","5","6","7","8"};

printf("Contents: %s\n", contents[1]);
printf("Contents: %s\n", &contents[1]);
printf("Contentsx: %s\n", contentsx[1]);
printf("Contentsx: %s\n", &contentsx[1]);
问题是,为什么内容[1]是元素1的值, 打印与&contents[1]相同的结果,它是元素1的地址 根据上下文,为什么contentsx[1]的值与
&contentsx[1](有一些未定义的行为)

内容
数组是
字符的8x2数组。它的元素是由2个字符组成的数组。因此,
contents[1]
是位于索引
1
char[2]
数组。当您获取该数组的地址时,它与该数组的初始元素的位置相同,即
&contents[1][0]
,它与字符串
“2”
的初始元素的位置相同

虽然
char[2]
的地址不是
printf
”对其
%s
格式说明符的期望,但在这种情况下它正好工作,因为地址恰好匹配;但是,这被认为是未定义的行为


当您在指针数组
contentsx
上尝试相同的操作时,结果不同:现在您正在索引
1
处传递指针的地址,该地址不再与字符串的位置一致,从而再次导致未定义的行为。不过,这一次,未定义的行为表现为不打印任何内容或打印随机字符。

这是因为
内容是数组的数组

contents[1]
表示此数组中的第二个数组。因此,它的名称会退化为指向其第一个元素(大小为1)的指针<代码>&contents[1]
指向整个数组,大小为2


xcontents[1]
是一个
char*
字符,指向给定字符串的确切位置
&xcontents[1]
是一个指向条目的
char**
,在本例中是一个
char*

m不确定,但尝试使用
printf(“内容:%u\n”,&Contents[1])
打印地址。为什么
contentsx[1]
&contentsx[1]
应该相等?你认为
&
没有任何意义吗?如果我写
&&&contentsx[1]
,那也应该等于
contentsx[1]
?我说“根据上下文”,意思是如果contents[1]的值与&contents[1]的值相同,那么contentsx[1]和&contentsx[1]可能就是这样,只要检查代码生成的警告,它们非常明确:我使用gcc时启用了-Werror标志,但没有收到任何警告/错误!我做错了什么?
Contents: 2
Contents: 2 
Contentsx:2 
Contentsx: //prints nothing or some garbage character