C - 修改 const 结构内指针的数据

标签 c pointers struct constants

所以我一直在假期里努力学习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/

相关文章:

php - 在 PHP 7.3 扩展中通过引用传递多个变量

c++ - C 和 C++ 静态初始化之间的区别

c# - 我们能否在 C# 中重载 Point 对象以使其支持 double ?

c - 简单链表代码出错

c++ - struct 中的 cin 和 char 数组指针

c - 如何移动已分配给另一个结构的内存

c - 如何使用 v4l2 linux 界面从网络摄像头获取视频?

2 个 2D vector 的叉积

c - c中结构指针之间的区别

c - 数组如何在结构中工作?