gpt4 book ai didi

c - 传递 const 变量时不兼容的指针类型

转载 作者:行者123 更新时间:2023-11-30 14:46:24 24 4
gpt4 key购买 nike

当我编译以下代码时,我收到一些编译器警告。

#include <stdio.h>
int global = 10;
void func_a(const int **pptr) {
*pptr = &global;
}
void func_b(int *const *pptr) {
**pptr = 20;
}
int main()
{
int local = 30;
int *ptr_1 = &local;
const int *ptr_2 = &local;
int* const ptr_3 = &local;
func_a(&ptr_1); /* line 15 : compile warning */
func_a(&ptr_2); /* line 16 : compile okay */
func_a(&ptr_3); /* line 17 : compile warning */

func_b(&ptr_1); /* line 19: compile okay? */
func_b(&ptr_2); /* line 20: compile warning */
func_b(&ptr_3); /* line 21: compile okay */

return 0;
}

警告:

a.c:15:12: warning: passing argument 1 of 'func_a' from incompatible pointer type [-Wincompatible-pointer-types]
a.c:17:12: warning: passing argument 1 of 'func_a' from incompatible pointer type [-Wincompatible-pointer-types]
a.c:20:12: warning: passing argument 1 of 'func_b' from incompatible pointer type [-Wincompatible-pointer-types]

据我了解,第 15 行和第 17 行收到了编译器警告,因为 func_a() 不想修改 **pptr。 (即 local 的值)。编译器发现可以通过指针 ptr_1ptr_3 修改该值。

第 20 行收到编译器警告,因为 func_b() 不想修改 *pptr。 (即指针)。ptr_2 可以更改指针。

但是,为什么第 19 行不会收到任何编译器警告?ptr_1 也可以更改指针。

最佳答案

声明 int *const *pptr 声明 pptr 是一个指向常量指针的指针,该指针指向非常量 int .

也就是说,该函数可以改变pptr指向的内容(pptr = xxx,相当无用),并且可以改变int<的值 (就像您在代码中所做的那样),但您无法更改 *pptr (*pptr = yyy 无效)。

由于您使用指向非常量 int 的指针调用该函数,所以没问题。

关于c - 传递 const 变量时不兼容的指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52327964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com