在C ++中存储字符串时,char *和char之间的区别是什么?

时间:2014-09-16 22:28:05

标签: c++ string pointers syntax

我看到了这个例子:

const char* SayHi() { return "Hi"; }

它工作正常,但是如果我试图移除指针它不起作用我无法形象  为什么。

const char SayHi() { return "Hi"; } \\Pointer removed

如果我为它分配一个这样的字符,那么它是有效的:

const char SayHi() { return 'H'; } \\Pointer removed and only 1 character

但我不知道是什么让它完全奏效。为什么指针能够容纳多个字符?指针只是一个指向另一个指针的变量吗?这指向什么?

3 个答案:

答案 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指向它所在的区域"保存"。