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"};

image

分析:
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;
}

运行图示:
image

posted @ 2022-11-02 13:09  就良同学  阅读(402)  评论(0编辑  收藏  举报