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
}
在上面的例子中,cs
是const 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;
更改该成员的结构定义
typedef struct S {
int i;
char *pc;
} S;
void foo() {
char str[] = "abcdefg";
const S cs = {1, str};
// more code
}
在上面的例子中,cs
是const 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;