[英]Difficulty in understanding the pointers output
請看下面的代碼:
#include <stdio.h>
void main()
{
int a=30;
int *var=&a;
Change(&var);
printf("%d %d",*var,a);
}
int Change(int**ptr)
{
**ptr=40;
}
#include <stdio.h>
void main()
{
int a=30;
int *var=&a;
Change(var);
printf("%d %d",*var,a);
}
int Change( int *ptr)
{
*ptr=40;
}
這兩個程序的輸出是40 40
我們正在傳遞var地址的副本,那么為什么將它反映在實際的main函數中並產生輸出40 40
?
為什么這兩個程序都產生相同的輸出?
這兩個程序是等效的。 在第一個中,您將指針傳遞給指針(即指針變量的地址),然后將其取消引用兩次。 在第二篇文章中,您只是傳遞指針(即實際變量的地址)並對其取消引用一次。
輸出是相同的,因為您通過指向int
的相同指針寫入了40
。 在第二種情況下,您傳遞了指向int的指針,使用*
運算符成功取消了對它的引用,並獲得了int
類型的lvalue,然后向其寫入40
。 在第一種情況下,您將指針傳遞給int。 然后您進行雙重解引用: **ptr
或與*(*ptr)
。 首先應用Inner *
,並使表達式的類型在大括號內為指針指向int的類型,而指針指向int的類型與第二種情況下傳遞給Change()
的相同。 最后,外部*
作用與第二種情況相同。
&var
傳遞的地址var
和Change
使用雙指針,因為, var
指向解決a
。 因此,對&var
( &var
地址)上的單個指針進行反引用將指向存儲在var
即a
的地址中的值,因此再次對其進行反引用將指向a
的值即30
。
我認為對於單指針Change
,您應該現在從上述詳細信息中弄清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.