[英]Pointers to char
char* pStr = new String("Hello");
char* s = "Hello";
第一个正确吗? 两者之间有什么区别吗? 我的猜测是第一个分配在堆上,另一个分配在堆栈上。我是对的还是其他区别?
第一个是不正确的,不会编译,因为在C或C ++中没有诸如String
类的东西。 第二个将编译,并且可以在C(afaik)中使用。 但是,在C ++中,不建议使用从字符串文字到char*
的转换。 您以后可能会无意中写s[0] = 'X';
这是未定义的行为。
正确的方法是使用const(在C ++中)
const char * s = "Hello";
或者,最好使用字符串
std::string s("Hello");
pStr和s是指针,因此区分指针本身和它们指向的数据非常重要。
在第一行,pStr是指向分配在堆上的String类的实例的指针。 此实例中的字符串数据是文字字符串“ Hello”的副本,该字符串存储在程序的数据段中 。 复制是由String构造函数完成的。 (您已经提到了String类,但是我假设您的意思是std :: string)。
在第二行中,s是指向存储在程序数据段中的数据的指针。 数据段中的数据是不可变的,因此s应该实际上是const char *。
您的示例中没有足够的信息来说明pStr和s是存储在堆还是堆栈中。 如果它们是函数内的变量,则它们在堆栈上。 如果有一个类的成员,那么如果该类是在帮助上(使用new)实例化的,则它们在堆上;如果它是作为值实例化的,则它们在堆栈上。
线
char* pStr = new std::string("Hello");
将导致编译器语义错误,因为LHS具有char*
类型,而RHS具有std::string
类型。
线
char* s = "Hello"
将编译,但可能会发出警告,因为LHS具有char*
类型,而RHS具有const char*
类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.