C++字符串赋值给字符指针的问题

首先,答案是:不可以直接赋值。

其实我原本对C++的字符串、字符指针和字符数组理解并不深刻,结果这次就遇到了问题:字符串传参给字符指针变量出错。


字符串

C++中有字符串类(虽然我本人不怎么用,函数传参一直在用字符指针)。比如"hello",用双引号括起来的是“字符串常量”,注意,它是常量。如果引用了<string>来声明字符串对象string s = "hello",则是变量。


字符指针

这个比较简单,就是指向字符变量的指针。


字符数组

由字符组成的数组。这里的数组名a表示的是数组首元素的地址,是个常量,而数组内的是字符变量。

1
char a[5];

有关字符串赋值字符指针的问题

我在很多地方都看到过下面这种写法

1
char *a = "hello";

问题来了,在我这用g++编译的时候有warning,并且程序运行的结果错误。

warning: ISO C++ forbids converting a string constant to ‘char*’

"hello"是字符串常量,拿来赋值时这个字符串常量返回的是首字符的地址,这个地址上的值(字符)是常量,不可变。而a是字符指针变量,指向的字符变量是可变的。

如果普通字符指针(指向字符变量)指向了一个不可变的内存区域,那这块内存的值到底是变呢还是不变呢?当然是不变了, 这是人家本身的性质,和我指不指没有关系,况且我不能这么辖指。 因此C++禁止把字符串常量的首地址赋值给字符指针变量

正确的写法应该是,字符串常量的首地址赋值给常字符指针。

1
const char *a = "hello"; //赋值给常字符指针

或者通过变量数组来完成值的传递。

1
2
char b[] = "hello"; //先把字符串常量赋值给字符数组b
char *ptr = b;      //字符数组b的首地址赋值给字符指针ptr

为什么第二种方法就行了呢?因为字符串常量赋值给字符数组b的是副本,无论怎样操作字符数组,原本的字符串常量都不会受到影响。而字符数组的元素(字符串中字符的副本)是字符变量,自然就可以把变量的地址赋值给指向变量的指针了。


总结

  • 字符串是常量。
  • 变量指针只能指向变量,不能指向常量。
  • 常量赋值给变量,是副本的形式,所以可以用这个方法来让变量指针指向一个常量副本(“假的常量”)。
updatedupdated2021-01-212021-01-21
加载评论