关于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指向的内存中的值进行修改。
全部评论

相关推荐

昨天 10:35
已编辑
西安科技大学 后端
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务