const char**与char**之间赋值问题

Posted jiangling500

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了const char**与char**之间赋值问题相关的知识,希望对你有一定的参考价值。

问题

#include <stdio.h>
int main()
{
    char* name[] = {"hello", "world"};
    char **cp = name;
    const char** ccp = cp;
    return 0;
}

编译器给出了一条警告:warning: initialization from incompatible pointer type [-Wincompatible-pointer-types] const char** ccp = cp;,即赋值等号两边的类型不相容。

原因

标准中有关合法形式赋值的约束条件:

两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。

而在上述代码中,指针cp指向的类型为char*,而指针ccp指向的类型为const char*,两个变量所指向的类型不相容,因此编译器会给出警告。那么为什么char*const char*不相容呢?这是因为const char*中的const修饰的不是指针本身,而是指针所指向的对象,类似于int*double*是不相容的。

正确的写法

#include <stdio.h>
int main()
{
    char* name[] = {"hello", "world"};
    char **cp = name;
    char * const * ccp = cp; // OK
    return 0;
}

在上述代码中,指针ccp指向的类型为char * const(带const限定的指向char的指针类型),指针cp指向的类型为char *(不带const限定的指向char的指针类型),因此是相容的。

扩展

const与*一起出现的时候,const究竟修饰的是谁呢?

int const * p1; // const修饰的是指针p1所指向的int类型对象
int * const p2; // const修饰的是指针p2
int * const * p3; // const修饰的是指针p3所指向的指针
int * const * const p4; // 第一个const修饰的是指针p4所指向的指针,第二个const修饰的是指针p4

总结成一句话,即const修饰的是其左边的对象。
参考链接

以上是关于const char**与char**之间赋值问题的主要内容,如果未能解决你的问题,请参考以下文章

[转载] C++ string, const char*, char* 之间互相转换

const char**与char**类型的区别

为指向 const 的指针赋值 指向 const char 的指针 (const char * const * p)

char * 和 const char * 之间的转换 [关闭]

const char * char const * char * const 三者的区别

const char* to char*(当函数传递参数时)