字符串常量初始化指针的小问题

参考文献链接:
https://blog.csdn.net/eroswang/article/details/1647436

char* p1 = "something";
char* p2 = "something";
printf("p1 = %x, p2 = %x \n", p1, p2);

在这里插入图片描述
显然,字符常量区中只有一个"something"。

再看:

char a[20] = "1234";
cout << a << endl;

char *p = a;
cout << p << endl;

在这里插入图片描述
那么该如何得到该字符串的地址呢?

cout << (int*)a << endl;
cout << &a << endl;

这两种方法都可以正确打印出“字符串的地址”,但是有细微区别之处

在字符数组a中,a表示第一个字符的地址,a+1表示第二个字符的地址;

在第一条打印地址的语句中,(int*)a只是起到了一个强制类型转换的作用,换句话说,a表示第一个字符的地址,但是cout <<a;输出的是整个字符串,这是因为这个地址是 char* 类型的,cout识别到 char* 类型的地址将会自动打印从该地址指向的空间开始直到遇到 ‘\0’ 的字符串内容,所以这里我们只需要进行一个强制类型转换(这里举例强制转换为 int* ,可以转换为其他类型的指针,只要不是 char* ,哪怕是 double* 也可以正确打印地址)。

第二条打印地址的语句中,直接使用了&a。这里需要强调==也就是元素指针和行指针的区别!==对于一维数组,a是元素指针,&a是行指针。

int a[10];
cout << "a  is: " << a << " a+1  is: " << a+1 << endl;
cout << "&a is: " << &a << " &a+1  is: " << &a+1 << endl;

在这里插入图片描述

下面说一说字符串常量,首先字符串存储在静态存储区,其次,不可修改。
于是就产生了下面几条语句:

char a[20] = "1234";
char * p = "1234";
const char * p = "1234";

第一条语句是将静态存储区的"1234"的副本拿出来复制到字符数组a中,所以这样初始化可以在后面随意更改副本"1234",这样并不会影响到真正的"1234";
第二条语句按理来说是错误的,很明显,像"1234"这样的字符串常量被存储在静态存储区中,他们的类型是 const char* 型,根据类型匹配原则,很显然将其赋给一个 char * 的指针肯定是不行的。但是目前有的编译器对于这种写法仍然不报错;
第三条语句绝对正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值