const 结构实例中成员的有效类型?

Effective type of members in a const structure instance?

typedef struct S {
    int i;
    char *pc;
} S;

void foo() {
    char str[] = "abcdefg";
    const S cs = {1, str};
    // more code
}

在上面的例子中,csconst S类型,而cs.i实际上是const int i,因为我无法将&cs.i传递给一个函数,它需要 int *,但只需要 const int *

问题是,cs.pc的有效类型是什么?是 const char * 还是 char * const?换句话说,我可以将 &cs.pc 传递给以下哪个函数?

A: void foo_a(const char * * ppcc);
B: void foo_b(char * const * pcpc);

const char *ptr : 意味着 ptr 应该指向同一个地址,你不能指望 ptr 持有其他地址。

cs.pc 只不过是 const char *pc,所以在将它传递给函数时

void foo_a(const char * * ppcc); // 不起作用 bcz ppcc 可以指向任何地址

这就是为什么你应该使用选项 B

void foo_b(char * const * pcpc);

该函数采用指向 const 的指针指向 char。它有以下原型:

void f(char * const *);

解释:

const S cs = {1, str}中的const限定符;适用于每个成员。对于 pc,它将它应用于指针本身,而不是它的内容1,因此它的类型是 char * const(指向 char 的常量指针)。

让我们用更简单的例子来说明:

int a = 100;
int * const p = &a;
T pp = &p;

什么是T?它是一种适合保存指向 const 的指针和指向 int 的指针的类型,所以这个 pp 的声明是:

int *const *pp = &p;

1) 为此,您需要使用 const char *pc;

更改该成员的结构定义