2012-07-27 113 views
2

我目前正在分析char和字符串数据类型。对于char数据类型,剪断下面的代码保存好:将值赋给字符串指针

char value = 'a'; 
char value1[] = "Good"; 
char* value2 = "Good"; 

对于字符串,

string strValue = "Good"; 
string strVal[3] = {"Good","Better","Best"}; 

但下面的分配将引发编译错误:

"error: scalar object strPtr requires one element in initializer"

string* strPtr = {"Good","Better","Best"} 

所以,最初如何将值分配到string*以上?

感谢, Udhai

+3

'char * value2 =“不好”;' - 通过语言设计中的错误,它是允许的,但它不应该是,它已被弃用。字符串文字驻留在只读存储器中,并且在该语句中,您正在为其中的第一个元素指定一个非const指针。所以如果你尝试修改字符串,它会编译,但它在运行时不起作用。那很糟。 – 2012-07-27 06:22:44

+0

指针指向一个地址;对?因此,当你为一个指针“赋值”的时候,你必须首先去引用它,然后你可以在指针所指向的地址处真正处理数据。试图给一个未被引用的指针指定一个值就是说你试图改变你指向的数据的地址。你给一个'string *'分配的是一个已经定义好的,或者至少是被声明的'string'。 – ChiefTwoPencils 2012-07-27 06:29:50

+0

在此期间没有固定过吗?我现在认为(C++ 0x或者更高版本的标准)字符串文字总是有const char *类型(并且这会产生编译错误)。 – Axel 2012-07-27 06:32:22

回答

3

指针不是数组,那么你为什么要否则假装?你可以这样做

string strVal[3] = {"Good","Better","Best"}; 
string* strPtr = strVal; 
-1

我想你是指std::string

正确的方法是

std::string *s(new std::string); 
// or 
std::string *s = new std::string; 

如果你想有一个指向字符串的指针和

std::string s_arr[3] = {"Good","Better","Best"}; 
string* str_p = strVal; 

如果你想有一个指针指向字符串数组的开始。

+0

'...(新的std :: string;'你错过了吗?)? – ChiefTwoPencils 2012-07-27 06:16:03

+0

是的。我会纠正这一点。谢谢 – steffen 2012-07-27 06:22:39

0

这工作:

std::string* strPtr{new std::string[3]{"Good","Better","Best"}}; 

这也编译

std::string* strPtr{(std::string[3]){"Good","Better","Best"}}; 

但结合指针到一个临时的,所以请不要那样做。

+0

在第一个示例中,您在堆上创建阵列,而不是堆栈,并且如果不希望内存泄漏,则必须手动删除。 – Axel 2012-07-27 06:29:51

+0

@Axel:这取决于一生......如果它是一个全球性的,那么就没有必要永远释放它,因为全局变量应该一直存在直到程序结束。 – 2012-07-27 13:45:07

+0

确实,但风格不好。 – Axel 2012-07-30 06:30:43