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

时间:2017-11-12 02:53:52

标签: c struct const member

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); 到?

SELECT threads.*, count(comments.thread) AS comments
FROM threads
JOIN comments ON comments.thread = threads.id
GROUP BY 1,2,3,4,5 -- one number here for each column of the threads table
LIMIT 10

2 个答案:

答案 0 :(得分:0)

该函数将指针指向指向const的{​​{1}}指针。它有以下原型:

char

说明:

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

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

char

什么是int a = 100; int * const p = &a; T pp = &p; ?它是一种适合保持指向T的{​​{1}}指针的类型,因此const的声明是:

int

1)为此,您需要使用pp

更改该成员的struct定义

答案 1 :(得分:-1)

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);