我看到了这个例子:
const char* SayHi() { return "Hi"; }
它工作正常,但是如果我试图移除指针它不起作用我无法形象 为什么。
const char SayHi() { return "Hi"; } \\Pointer removed
如果我为它分配一个这样的字符,那么它是有效的:
const char SayHi() { return 'H'; } \\Pointer removed and only 1 character
但我不知道是什么让它完全奏效。为什么指针能够容纳多个字符?指针只是一个指向另一个指针的变量吗?这指向什么?
答案 0 :(得分:3)
这是因为根据定义char
是单个字符(就像你的第三种情况一样)。如果你想要一个字符串,你可以使用char
的数组衰减到const char*
(就像你的第一种情况一样),或者使用C ++方式,使用std::string
。
Here你可以阅读更多关于“数组衰减到指针”的事情。
答案 1 :(得分:1)
你是正确的,指针只是一个指向某处的变量 - 在这种情况下,它指向内存中某处的字符串。按照惯例,字符串(char数组)以空字符(0)结尾,因此像strlen这样的操作可以安全终止而不会溢出缓冲区。
至于特定指针(在第一个示例中)指向的位置,它指向字符串文字“Hi”(在编译器末尾添加了一个空终止符)。该位置取决于平台,并已回答here。
在C ++中使用std :: string比使用普通C字符数组更好。
答案 2 :(得分:0)
char
是整数类型。 char
的范围是[-128; 127]
char*
是一个指向内存中单个字符的指针。
按照惯例,我们称之为字符串的是char数组,其中0x00作为最后一个字符。例如:
char str[10];
str[0] = 'S';
str[1] = 'o';
str[2] = '\0'; // \0 represent the character of value 0
我在这里使用'而不是",因为'代表一个字母,"一个字符串。
"foo"
实际上意味着'f'+'o'+'o'+'\0'
下一个问题应该是:
const char* foo = "bar";
的作品?因为foo不是数组。
事实上" bar"就像在记忆中那样存储,foo指向它所在的区域"保存"。