Ali*_*aba 3 c const void-pointers
在下面的:
struct adt { void * A; };
int new_adt(const void * const A)
{
struct adt * r = malloc(sizeof(struct adt));
r->A = A;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
警告:赋值从指针目标类型中丢弃限定符
我知道我可以使用
memcpy(&(r->A), &A, sizeof(void *));
Run Code Online (Sandbox Code Playgroud)
解决它,但我必须问:有什么选择吗?
通过使用const void * const我假装说不会对输入进行任何更改.而且,现在我想到它,const void *就足够了,不是吗?(因为我无法更改指针以便它影响调用者)
感谢您抽出宝贵时间阅读.
通过使用const void*const,我假装没有对输入进行任何更改.
您没有 假装说输入不会进行任何更改,您已明确告诉编译器您已保证不会对输入进行任何更改.
你不能做你正在做的事情.
如果你从来没有要修改A通过从它的指针adt,那么你应该做的是指针常量为好,即:
struct adt {
const void * A;
};
Run Code Online (Sandbox Code Playgroud)
这将使错误消失.
如果你不希望修改A过adt,那么new_adt应该采取非const指针.
编辑:更一般的说明,这可能会有所帮助:
该const关键字,一般适用于类型立即到其左侧.但是,如果左侧没有类型,则它将应用于右侧的类型.所以:
const int * A与int const * A(const适用于int,而不是指针)相同,但是int * const A,const适用于指针,而不适用于int.
维基百科有一个更全面的解释:const-correctness.该页面的"指针和引用"部分包含一个示例,其中包含可应用于指针的const和非const的各种组合.