关于两种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
请按任意键继续. . .
发布了36 篇原创文章 · 获赞 3 · 访问量 1245

猜你喜欢

转载自blog.csdn.net/Zen_Ivan/article/details/105313068