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