C | 常量与指针间的转换 warning: ISO C++ forbids converting a string constant to 'char*'
使用指针数组保存字符串并将字符串打印输出。
代码如下:
#include<stdio.h>
int main(){
// 定义指针数组
char *s[4] = {"ABC", "DEF", "GHI", "JKL"};
int n = 4;
int i;
char *aPtr;
// 方法1:通过数组名输出字符串
for(i=0;i<n;i++){
printf("第%d个字符串:%s\n", i+1, s[i]);
}
// 方法2:通过指向数组的指针输出字符串
for(aPtr=s[0],i=0;i<n;aPtr=s[i]){
printf("第%d个字符串:%s\n", i+1, aPtr);
i++;
}
return 0;
}
可以编译运行,但是显示一个警告:
main.c:5:45: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
char *s[4] = {"ABC", "DEF", "GHI", "JKL"};
分析:
char *s[4] = {"ABC", "DEF", "GHI", "JKL"};
也就是说,字符串常量是不能转化为指针变量的。指针数组中存放的是指针变量,指针变量存放的是右边每一个字符串常量的内存首地址,是指示器。右边则只是字符串常量即字面上"ABC"这些。指针即地址和常量有本质性的区别。编译器虽然可以编译,但是会给出警告,表明这是不符合规定的。所以一般建议当const char *类型处理。
修改:
const char *s[4] = {"ABC", "DEF", "GHI", "JKL"};
const修饰,表明指针s指向的内存区域不能被修改,实际上是不能通过s修改s所指向内存区域的内容。
同理,const char *aPtr;
来源于《C Primer Plus》第五版中文版:
关于指针赋值和const有一些规则需要注意。首先,将常量或非常量数据的地址赋给指向常量的指针是合法的:
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double locked[4] = {0.08, 0.075, 0.0725, 0.07};
const double *pc = rates; //合法
pc = locked; //合法
pc = &rates[3]; //合法
然而,只有非常量数据的地址才可以赋给普通的指针:
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double locked[4] = {0.08, 0.075, 0.0725, 0.07};
double *pnc = rates; //合法
pc = locked; //非法
pc = &rates[3]; //合法
这样的规则是合理的。否则,你就可以使用指针来修改被认为是常量的数据。
最终代码:
#include<stdio.h>
int main(){
// 定义指针数组
const char *s[4] = {"ABC", "DEF", "GHI", "JKL"};
int n = 4;
int i;
const char *aPtr;
// 方法1:通过数组名输出字符串
for(i=0;i<n;i++){
printf("第%d个字符串:%s\n", i+1, s[i]);
}
// 方法2:通过指向数组的指针输出字符串
for(aPtr=s[0],i=0;i<n;aPtr=s[i]){
printf("第%d个字符串:%s\n", i+1, aPtr);
i++;
}
return 0;
}
运行图示: