所以我一直在嘗試在假期學習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
我的一般概念是,雖然結構是常量,但指標指向的值不是,因此您可以修改它。有人可以解釋這里到底發生了什么嗎?
編輯:輕微改寫
uj5u.com熱心網友回復:
該函式按值接受其引數
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 和引數中的指標指向同一個物件,因此您可以更改 main 中宣告的結構的指標所指向的物件
考慮這些宣告
const int *ptr = &x;
這意味著指標ptr所指向的物件被認為是一個常量。
在這個宣告中
int * const ptr = &x;
指標本身就是一個常數。
最后在這份宣告中
const int * const ptr = &x;
指標本身和指標指向的物件都是常量。
uj5u.com熱心網友回復:
程式中的任何內容都不會更改指標的值。*value.ptr = 0;更改指標指向的事物的值。因為value.ptris 在const結構內部,所以它是const,這意味著您不應該嘗試更改它。但它是指向其他東西的指標。那別的東西不是const。以此類推,如果我用墨水寫了我的地址,所以我不能改變寫的地址,這并不意味著我不能改變我家里的任何東西。value.ptr只是告訴我們在哪里x。即使我們不能改變 ,我們也可以改變x(甚至使用*value.ptr,即x)value.ptr。
uj5u.com熱心網友回復:
據我了解,指標指向的記憶體塊不會改變。但是,指向的記憶體塊中的值會發生變化。
因此,如果您嘗試更新指標以指向不同的地址,您將無法做到。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506476.html
