关于两种C/C++中字符数组和字符型指针

执行如下代码

char * p = "1234";

会提示如下警告:[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings],大意为:非常不赞成将字符串型常量转换为字符型。

报警告的原因大致是因为"1234"是字符串常量,常量不允许被修改,如果char * p = "1234";编译成功,那就意味着"1234"有可能被修改,而这是不被允许的。在char前面加上const限定符则警告不再出现。

对于如下两行代码,执行的效果有本质的差异。

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

 使用分别打印字符数组a,字符型指针p以及字符串常量的地址。

printf("a-->%x\n", a);
printf("p-->%x\n", p);
printf("1234-->%x\n", &"1234");

 结果如下:

a-->6ffe00
p-->488000
1234-->488000

--------------------------------
Process exited after 0.1753 seconds with return value 0
请按任意键继续. . .

可见前面的两行代码的差异在于第二行直接将常量“1234”的地址赋值给指针p,而第一行是将“1234”的副本赋值给地址在别处的字符数组。

关于查看指针所指向的地址的方法,虽然a本身是个指向字符数组首元素地址的指针,但使用cout << a << endl;打印出来的却是a指向的地址的内容,需要对a取地址或使用printf打印。代码和结果如下,其中第三行输出开头的0x是输出16进制时的前缀。

	cout << a << endl;
	printf("a-->%x\n", a);
	cout<< "a-->" << &a << endl;
1234
a-->6ffe00
a-->0x6ffe00

--------------------------------
Process exited after 0.1677 seconds with return value 0
请按任意键继续. . .

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值