[英]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.ptr
在const
結構內,它是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.