首先,你需要了解如何“串”工作C.
“字符串”存储为字符的内存中的数组。由于没有办法确定字符串的长度,所以在字符串后面追加NUL字符'\0'
,以便我们知道它的结束位置。
因此,举例来说,如果你有一个字符串“foo”,它可能看起来像这样的记忆:
--------------------------------------------
| 'f' | 'o' | 'o' | '\0' | 'k' | 'b' | 'x' | ...
--------------------------------------------
'\0'
后的东西只是东西,恰好被放置在字符串之后,这可能是可能不会被初始化。
当你给一个类型为char *
的变量赋值一个“字符串”时,会发生什么变量会指向字符串的开始,所以在上面的例子中它会指向'f'
。 (换句话说,如果你有一个字符串str
,那么str == &str[0]
总是如此。)当你给一个char *
类型的变量赋值一个字符串时,实际上是将该字符串的第零个字符的地址赋值给该变量。
当您将此变量传递给printf()
时,它将从指向地址开始,然后逐个遍历每个字符,直到看到'\0'
并停止。例如,如果我们有:
char *str = "foo";
,你把它传递给printf()
,它将执行以下操作:
- 提领
str
(这给'f'
)
- 提领
(str+1)
(这给'o'
)
- Dereference
(str+2)
(它给出了另一个'o'
)
- 解除引用
(str+3)
(它给出'\0'
,这样过程停止)。
这也得出结论,你目前的行为实际上是错误的。在你的代码有:
char charMemoryHolder = 'G';
myCharPointer = &charMemoryHolder;
printf("%s\n", myCharPointer);
当printf()
看到%s
符,它的推移myCharPointer
到指向的地址,在这种情况下,它包含'G'
。然后它会尝试获得'G'
之后的下一个字符,这是未定义的行为。它可能时不时给你正确的结果(如果下一个内存位置碰巧包含'\0'
),但一般来说你不应该这样做。
来源
2015-11-22 07:30:28
ace