C++字符串赋值给字符指针的问题 | 您所在的位置:网站首页 › 指针怎么赋值字符串数组 › C++字符串赋值给字符指针的问题 |
首先,答案是:不可以直接赋值。 其实我原本对C++的字符串、字符指针和字符数组理解并不深刻,结果这次就遇到了问题:字符串传参给字符指针变量出错。 字符串C++中有字符串类(虽然我本人不怎么用,函数传参一直在用字符指针)。比如"hello",用双引号括起来的是“字符串常量”,注意,它是常量。如果引用了来声明字符串对象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的是副本,无论怎样操作字符数组,原本的字符串常量都不会受到影响。而字符数组的元素(字符串中字符的副本)是字符变量,自然就可以把变量的地址赋值给指向变量的指针了。 总结 字符串是常量。 变量指针只能指向变量,不能指向常量。 常量赋值给变量,是副本的形式,所以可以用这个方法来让变量指针指向一个常量副本(“假的常量”)。 |
CopyRight 2018-2019 实验室设备网 版权所有 |