繁体   English   中英

指向char的指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM