为什么一个字符串不是 return 它的内存位置?
Why does a string not return its memory location?
他们说字符串自然是一个字符数组,表示第一个字符的内存位置:string == &string[0]。这就是为什么当用户希望程序将数据读入该变量时,用户不必在字符串变量前指定 & 符号:
scanf("%s", string);
但是有一个合理的问题:为什么我们在打印 string 时看不到字符串的内存位置?
printf("%s", string);
But then there is a reasonable question: why don't we see &string[0] when printing string out?
printf("%s", string);
我假设你的意思是你希望看到打印的地址而不是内容。
这就是格式说明符的用途。
您将第一个字符的地址传递给 printf
并且因为该参数有一个 %s
格式说明符,该函数知道它必须获取地址,取消引用它并打印任何字符直到 0
在内存中找到。
如果您提供了 %p
格式说明符,您会看到打印的地址。
在这种情况下,您需要将地址转换为 void*
才能完全符合标准。
They say a string is naturally an array of characters which represents the memory location of its first character: string == &string[0]
这里有两个小的澄清。
字符串在技术上不是字符数组。它被定义为 “由第一个零代码单元终止的连续代码单元序列” 或者正如 RobertS 在评论中所说:“一个字符串可以是(和高-可能是) 存储在数组中,但字符串不是数组。字符串只是以空字符结尾的字符序列。字符串不是数组,数组也不是字符串。"
如果string
是数组而不是指针,那么它们会有不同的类型。 string
是 char[]
类型,&string[0]
是 char*
类型。但是,如果您进行比较 string == &string[0]
,则 string
将衰减为 char*
,并且表达式的计算结果为真。
相关:
Is an array name a pointer?
他们说字符串自然是一个字符数组,表示第一个字符的内存位置:string == &string[0]。这就是为什么当用户希望程序将数据读入该变量时,用户不必在字符串变量前指定 & 符号:
scanf("%s", string);
但是有一个合理的问题:为什么我们在打印 string 时看不到字符串的内存位置?
printf("%s", string);
But then there is a reasonable question: why don't we see &string[0] when printing string out?
printf("%s", string);
我假设你的意思是你希望看到打印的地址而不是内容。
这就是格式说明符的用途。
您将第一个字符的地址传递给 printf
并且因为该参数有一个 %s
格式说明符,该函数知道它必须获取地址,取消引用它并打印任何字符直到 0
在内存中找到。
如果您提供了 %p
格式说明符,您会看到打印的地址。
在这种情况下,您需要将地址转换为 void*
才能完全符合标准。
They say a string is naturally an array of characters which represents the memory location of its first character: string == &string[0]
这里有两个小的澄清。
字符串在技术上不是字符数组。它被定义为 “由第一个零代码单元终止的连续代码单元序列” 或者正如 RobertS 在评论中所说:“一个字符串可以是(和高-可能是) 存储在数组中,但字符串不是数组。字符串只是以空字符结尾的字符序列。字符串不是数组,数组也不是字符串。"
如果string
是数组而不是指针,那么它们会有不同的类型。 string
是 char[]
类型,&string[0]
是 char*
类型。但是,如果您进行比较 string == &string[0]
,则 string
将衰减为 char*
,并且表达式的计算结果为真。
相关:
Is an array name a pointer?