[英]Can't understand small part of a C program involving pointers
int x = 5;
int y = 6;
int *p = &x;
*p = x + y;
p = &y;
*p = x + y;
printf("%d,%d", x, y);
我可以理解前三行。 我知道int *p = &x;
表示指針p
指向x
的存儲地址。 但是我看不懂代碼的下4行。 該代碼的輸出為:
11,17
但是我不明白怎么辦? 有人可以向我解釋。
指針是一個變量,其值是另一個變量的地址,即存儲位置的直接地址。
這樣分配時,
int *p=&x;// It will point to the address of x variable.
*p
所做的任何更改都會影響內存。 因此,當您使用x
訪問它時,它具有值。
*p=x+y; // It's equivalent x=x+y;
然后y
也很喜歡這一點。
現在x
的值為11
。 p=&y;
*p=x+y;// It's equivalent to y=x+y;
所以現在x的值為11
,y的值為5
。 因此,結果為17
。
讓我們逐行分析代碼,對吧?
在給出答案之前,將一個小信息*
稱為間接或取消引用運算符,該運算符用於訪問內存地址處的值 。
因此,根據您的代碼:
*p = x + y;
將x
和y
相加,然后將值存儲在p
指向的存儲位置中 (即x
的地址)。 。 因此,這樣, x
的實際值將被修改。 現在, x
持有x+y
或5+6
或11
。
p = &y;
與int *p = &x;
相同的邏輯
*p = x + y;
與第一點相同的邏輯。 請記住, x
值是在第一次修改的,因此將考慮最新的x
值。 因此,修改后的y
將為11 + 6
或17
。
printf("%d,%d", x, y);
現在,不要告訴我您不了解這一行。 :-)
*p = x + y;
因此,現在p將指向x的地址,而(* p)將指向x中存儲的值。 因此,您可以在內存位置更改x的值。
p = &y;
現在,您將y的地址分配給p。
*p = x + y;
現在,您可以使用其內存地址更改y的值。
實際上,此代碼段
int x = 5;
int y = 6;
int *p = &x;
*p = x + y;
p = &y;
*p = x + y;
printf("%d,%d", x, y);
您可以重寫以下方式而無需使用指針,這樣會更清楚
int x = 5;
int y = 6;
x = x + y;
y = x + y;
printf("%d,%d", x, y);
因此,首先將x
設置為x + y
和,將等於11
,然后將y
設置為更新的x
(現在等於11)和y
和,並將等於17
。
唯一的區別在於,第一個代碼段不是直接使用x
和y
,而是使用指針。
從而
陳述x = x + y; 替換為這兩個語句的組合
int *p = &x;
*p = x + y;
和聲明
y = x + y;
替換為這兩個語句的組合
p = &y;
*p = x + y;
也就是說,首先為指針p分配了x的地址
int *p = &x;
並為對象(即x)分配了x + y的和
*p = x + y;
對於變量y和指針p重復相同的操作。
*p = x + y
解引用指針p,將x + y
值分配給p指向的內存。 等效於x = x + y
。 x現在等於x + y
,即5 + 6 = 11
。
p = &y
將y的地址分配給指針p。 指針p指向換句話說y的存儲。
*p = x +y
解引用指針p,將x + y
值分配給p指向的內存。 等效於y = x + y
。 y現在等於x + y,即11 + 6 = 17
。
最后, x = 11
, y = 17
。
希望能幫助到你。
為了更好地理解指針和相關的與號和星號,我建議使用以下基本聲明:
讓我們假設:
int * p;
int x;
1)指針是一個地址。 這意味着在p中是內存中存儲整數值的地址
2)當使用* p時,可以將星號符號“翻譯”為“地址值”; 這意味着當我們使用* p時,我們想要取一個位於地址p中的值;
3)當使用&x時,“&”符號可以“翻譯”為“的地址”; 這意味着我們要取x的地址;
因此操作:
0)p = x; 是不正確的;
1)* p = x; 是正確的(如果p是有效地址),並且地址p的值現在與值x相同;
2)p =&x; 是正確的,並且* p == x; 在這種情況下,您還需要了解p和&x是相同的地址。 因此,如果您更改* p或x,則另一個也將具有相同的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.