簡體   English   中英

難以理解指針輸出

[英]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

為什么這兩個程序都產生相同的輸出?

這兩個程序是等效的。 在第一個中,您將指針傳遞給指針(即指針變量的地址),然后將其取消引用兩次。 在第二篇文章中,您只是傳遞指針(即實際變量的地址)並對其取消引用一次。

在我看來,您需要以下插圖來獲得關於q的答案:

指針圖

輸出是相同的,因為您通過指向int的相同指針寫入了40 在第二種情況下,您傳遞了指向int的指針,使用*運算符成功取消了對它的引用,並獲得了int類型的lvalue,然后向其寫入40 在第一種情況下,您將指針傳遞給int。 然后您進行雙重解引用: **ptr或與*(*ptr) 首先應用Inner * ,並使表達式的類型在大括號內為指針指向int的類型,而指針指向int的類型與第二種情況下傳遞給Change()的相同。 最后,外部*作用與第二種情況相同。

&var傳遞的地址varChange使用雙指針,因為, var指向解決a 因此,對&var&var地址)上的單個指針進行反引用將指向存儲在vara的地址中的值,因此再次對其進行反引用將指向a的值即30

我認為對於單指針Change ,您應該現在從上述詳細信息中弄清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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