为什么我可以修改C中的const指针?

今天我尝试使用const标识符,但我发现const变量仍然可以修改,这让我感到困惑。

以下是代码,在compare(const void * a,const void * b)函数中,我试图修改a指向的值:

#include  #include  int values[] = {40, 10, 100, 90, 20, 25}; int compare (const void *a, const void*b) { *(int*)a=2; /* Then the value that a points to will be changed! */ return ( *(int*)a - *(int*)b); } int main () { int n; qsort(values, 6, sizeof(int), compare); for (n = 0; n < 6; n++) printf("%d ", values[n]); return 0; } 

然后我也尝试改变自己的价值:

 #include  #include  int values[] = {40, 10, 100, 90, 20, 25}; int compare (const void *a, const void*b) { a=b; return ( *(int*)a - *(int*)b); } int main () { int n; qsort(values, 6, sizeof(int), compare); for (n = 0; n < 6; n++) printf("%d ", values[n]); return 0; } 

但是,我发现它们都有效。任何人都可以向我解释为什么我需要在比较参数列表中使用const,如果它们仍然可以更改?

情况1:您正在使用静态强制转换来抛弃常量。 您违反了为方法定义的合同。

情况2:您没有更改a(const)的内容,而是分配包含const void指针的变量a。

对于实际意义:对于案例1.)你可以用脚射击自己,以防万一没有真正指向一个变量。

建议:只有在你知道自己在做什么的情况下才能抛弃constness。

它只适用于这种情况,因为你正在使用的指针最初并不是常数。 抛弃const然后修改值是未定义的行为。 UB意味着应用程序可以做任何事情,从成功到崩溃,让紫色的龙飞出你的鼻孔。

它保护你免受愚蠢的错误,而不是当你努力犯错时。
(int *)aaconst something *是一种不好的做法,请改用(const int *)a
a = baconst void *是好的,因为只有指向的值是const。 如果你想要*a = xa = x不允许,请声明a const void * const

其实。

 int compare (const void *a, const void*b); 

这里有两件事你需要考虑,指针和指针所指向的内存位置。 指针不是常量,而是内存位置。

如果要将签名更改为:

 int compare (const void *const a, const void *const void); 

然后一切都将是const。 在您的情况下,您可以更改指针,但不能更改值。 这样你的指针就可以指向不同的内存位置。