所以我一直在假期里努力学习C。现在我遇到了 const
,所以我一直在研究它。过了一段时间我发现了这个
#include <stdio.h>
typedef struct StructA {
int* ptr;
} struct_a;
void modify(const struct_a value)
{
*value.ptr = 0;
}
int main()
{
int x = 5;
const struct_a y = { .ptr = &x };
printf("%d\n", x);
modify(y);
printf("%d", x);
return 0;
}
// Output:
// 5
// 0
我的一般概念是,虽然结构是不变的,但指针指向的值不是,因此您可以修改它。有人可以解释一下到底发生了什么吗?
编辑:小幅改写
最佳答案
函数按值接受其参数
void modify(const struct_a value)
{
*value.ptr = 0;
}
您可以按以下方式想象该函数及其调用
const struct_a y = { .ptr = &x };
//...
modify(y);
//...
void modify( /*const struct_a value*/)
{
const struct_a value = y;
*value.ptr = 0;
}
表示该对象值的数据成员ptr是常量。
即函数内的结构实际上具有以下定义
typedef struct StructA {
int * const ptr;
} struct_a;
因此您不能更改数据成员 ptr 本身(存储在数据成员 ptr 中的值)。但是你可以改变数据成员ptr指向的对象
*value.ptr = 0;
由于函数参数中的指针ptr和实参中的指针ptr指向同一个对象,因此可以更改main中声明的结构体指针所指向的对象
考虑这些声明
const int *ptr = &x;
这意味着指针ptr指向的对象被视为常量。
在此声明中
int * const ptr = &x;
指针 iyself 是一个常量。
最后在此声明中
const int * const ptr = &x;
指针本身和指针指向的对象都是常量。
关于C - 修改 const 结构内指针的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73613174/