C 为什么字符串不返回其内存位置?

C 为什么字符串不返回其内存位置?,c,scanf,memory-address,C,Scanf,Memory Address,他们说字符串自然是一个字符数组,它表示第一个字符的内存位置:string==&string[0]。这就是为什么当用户希望程序将数据读入字符串变量时,不必在字符串变量之前指定“与”: scanf("%s", string); 但还有一个合理的问题:为什么我们在打印字符串时看不到字符串的内存位置 但还有一个合理的问题:为什么我们在打印字符串时不看到&string[0] 我想你的意思是你希望看到打印的地址而不是内容 这就是格式说明符的作用。 将第一个字符的地址传递给printf,

他们说字符串自然是一个字符数组,它表示第一个字符的内存位置:string==&string[0]。这就是为什么当用户希望程序将数据读入字符串变量时,不必在字符串变量之前指定“与”:

scanf("%s", string);
但还有一个合理的问题:为什么我们在打印字符串时看不到字符串的内存位置

但还有一个合理的问题:为什么我们在打印字符串时不看到&string[0]

我想你的意思是你希望看到打印的地址而不是内容

这就是格式说明符的作用。 将第一个字符的地址传递给
printf
,由于该参数有
%s
格式说明符,函数知道它必须获取地址,取消引用并打印任何字符,直到在内存中找到
0

如果您提供了
%p
格式说明符,您将看到打印的地址。 在这种情况下,您需要将地址强制转换为
void*
,以完全符合标准

他们说字符串自然是一个字符数组,它表示第一个字符的内存位置:string==&string[0]

这里有两个小的澄清

从技术上讲,字符串不是字符数组。它被定义为“由第一个零代码单元终止的连续代码单元序列”,或者如RobertS在评论中所说:“字符串可以(很可能是)存储在数组中,但字符串不是数组。字符串只是由空字符终止的字符序列。字符串不是数组,数组也不是字符串。”

如果
string
是数组而不是指针,则它们将具有不同的类型<代码>字符串的类型为
char[]
&string[0]
的类型为
char*
。但是,如果进行比较,
string==&string[0]
,则
string
将衰减为
char*
,表达式的计算结果将为true

相关的:


如果它在一个实例中衰减到一个指针,为什么您不希望它在两个实例中都衰减到一个指针?您能更准确地说明您希望它打印的内容吗?创建一个最小的主函数,并显示输入、预期输出和实际输出。@klutt我预期由&string[0]表示的内容–字符串内存位置。由于string==&string[0],我希望string给出与&string[0]相同的值,这就是问题所在。如果
p
是指针,则表达式
p
&p[0]
是相同的。@Kaiyaha是的,但这在问题中并不清楚。如果您的意思是应该打印文本字符串“&string[0]”或It地址,则有点模棱两可。注释不用于扩展讨论;此对话已结束。评论不用于扩展讨论;这段对话已经结束。
printf("%s", string);
printf("%s", string);