首先,答案是:不可以直接赋值。
其实我原本对C++的字符串、字符指针和字符数组理解并不深刻,结果这次就遇到了问题:字符串传参给字符指针变量出错。
字符串
C++中有字符串类(虽然我本人不怎么用,函数传参一直在用字符指针)。比如"hello"
,用双引号括起来的是“字符串常量”,注意,它是常量。如果引用了<string>
来声明字符串对象string s = "hello"
,则是变量。
字符指针
这个比较简单,就是指向字符变量的指针。
字符数组
由字符组成的数组。这里的数组名a表示的是数组首元素的地址,是个常量,而数组内的是字符变量。
|
|
有关字符串赋值字符指针的问题
我在很多地方都看到过下面这种写法
|
|
问题来了,在我这用g++编译的时候有warning,并且程序运行的结果错误。
warning: ISO C++ forbids converting a string constant to ‘char*’
"hello"
是字符串常量,拿来赋值时这个字符串常量返回的是首字符的地址,这个地址上的值(字符)是常量,不可变。而a
是字符指针变量,指向的字符变量是可变的。
如果普通字符指针(指向字符变量)指向了一个不可变的内存区域,那这块内存的值到底是变呢还是不变呢?当然是不变了, 这是人家本身的性质,和我指不指没有关系,况且我不能这么辖指。 因此C++禁止把字符串常量的首地址
赋值给字符指针变量
。
正确的写法应该是,字符串常量的首地址赋值给常字符指针。
|
|
或者通过变量数组来完成值的传递。
|
|
为什么第二种方法就行了呢?因为字符串常量
赋值给字符数组b
的是副本,无论怎样操作字符数组,原本的字符串常量都不会受到影响。而字符数组的元素(字符串中字符的副本)是字符变量,自然就可以把变量的地址
赋值给指向变量的指针
了。
总结
- 字符串是常量。
变量指针
只能指向变量
,不能指向常量。- 常量赋值给变量,是副本的形式,所以可以用这个方法来让变量指针指向一个常量副本(“假的常量”)。