簡體   English   中英

C - 修改 const 結構內指針的數據

[英]C - Modifying data of a pointer inside a const struct

所以我一直在嘗試在假期學習 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

我的一般概念是,雖然結構是常量,但指針指向的值不是,因此您可以修改它。 有人可以解釋這里到底發生了什么嗎?

編輯:輕微改寫

程序中的任何內容都不會更改指針的值。 *value.ptr = 0; 更改指針指向的事物的值。 由於value.ptrconst結構內,它是const ,這意味着您不應該嘗試更改它。 但它是指向其他東西的指針。 其他東西不是const 以此類推,如果我用墨水寫了我的地址,所以我不能改變寫的地址,這並不意味着我不能改變我家里的任何東西。 value.ptr只是告訴我們x在哪里。 即使我們無法更改value.ptr ,我們也可以更改x (即使使用*value.ptr ,即x )。

function 按值接受其參數

void modify(const struct_a value)
{
    *value.ptr = 0;
}

您可以想象 function 及其調用方式如下

const struct_a y = { .ptr = &x };
//...
modify(y);
//...

void modify( /*const struct_a value*/)
{
    const struct_a value = y;
    *value.ptr = 0;
}

這意味着 object 值的數據成員 ptr 是常數。

也就是function里面的結構其實有如下定義

typedef struct StructA {
    int * const ptr;
} struct_a;

因此,您可能不會更改數據成員 ptr 本身(存儲在數據成員 ptr 中的值)。 但是你可以改變數據成員ptr指向的object

*value.ptr = 0;

由於 function 參數中的指針 ptr 和參數中指向相同的 object 您可以更改 main 中聲明的結構的指針指向的 object

考慮這些聲明

const int *ptr = &x;

這意味着指針ptr指向的object被認為是一個常數。

在這個聲明中

int * const ptr = &x;

指針本身就是一個常數。

最后在這份聲明中

const int * const ptr = &x;

指針本身和指針指向的 object 都是常量。

據我了解,指針指向的 memory 塊不會改變。 但是,指向的 memory 塊中的值發生了變化。

因此,如果您嘗試更新指針以指向不同的地址,您將無法做到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM