关于char *p=“hello“
1、简言
最近面试刷到很多考这个知识点的基础题。来简单写一下。
2、例题
void test02(char *xp)
{
cout<<&xp<<endl; //0x61fdf0
xp = "std";
}
...
char * p = "hello";
cout<<&p<<endl; //0x61fe18
test02(p);
cout<<p<<endl; //hello
...
对于这道题,有部分人应该想的是p打印出来是std。因为实参p的地址给到xp,xp就指向了p所指向的内存。这时候对这块内存的改变应该会影响实参的值。
如果是整形变量的话,这样是没问题的,比如:
void test01(int *a)
{
cout<<a<<endl; //0x61fe0c
*a = 6;
}
...
int a = 4;
int *ap = &a;
cout<<ap<<endl; //0x61fe0c
test01(ap);
cout<<a; //6
...
那么为什么上述代码不行呢?这其实是C++兼容C语言的一个遗留问题
3、问题
对于char * p = "hello";这种写法,其实编译器不会报错,而是会报一个warning: [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings] 这个警告的意思是:禁止把字符串常量转换为'char *'这种类型。
因为C++中扩展了string类型,所以对于“hello”,编译器会将其当成常量放在常量存储区。该区内容是不可更改的。
4、总结
想了许久,还有有以下疑问:
- char p = "hello"; void test(char *xp); test(p);为何xp所指向的地址和p指向的地址不是同一块地方。
- 如果"hello"存储在常量区,为什么void test(char *&xp)可以对xp指向的内存中的值进行修改。