执行如下代码
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
请按任意键继续. . .