簡體   English   中英

無法理解涉及指針的C程序的一小部分

[英]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; xy相加,然后將值存儲在p指向存儲位置中 (即x的地址)。 因此,這樣, x的實際值將被修改。 現在, x持有x+y5+611

  • p = &y; int *p = &x;相同的邏輯

  • *p = x + y; 與第一點相同的邏輯。 請記住, x值是在第一次修改的,因此將考慮最新的x值。 因此,修改后的y將為11 + 617

  • 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

唯一的區別在於,第一個代碼段不是直接使用xy ,而是使用指針。

從而

陳述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 = 11y = 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.

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