2013-05-15 67 views
2

如果值存儲在一個地址,那麼請問這個聲明做獲取值使用間接運算符

int a = 10; 

其存儲在一個或者在&一個地址的值。而如果將其存儲在一個地址中的值,那麼我們爲什麼不能用間接的方式這個變量是這樣的:

printf("%d", *a); 

如果不是,那麼我們怎麼能說,每個值都有一個唯一的地址,我們可以使用間接運算符訪問它們。

編輯:如果我認爲間接僅用在指針,然後再考慮這一點:

int b[10]; 
b[0] = 4; // Give it some value 

現在我們知道,B [0]是一個標量,並且可以在任何地方使用,其中標量值是必要的。但是,在這種情況下,我們可以用間接的方式是這樣的:

printf("%d", *b); // print 4 

是不是有趣的是,我們可以在這個標量變量使用指針,但沒有對數組變量聲明不能使用。

在我看來,編譯器會自動生成可變的間接聲明是這樣的:

int a = 4; 

所以,間接是不可能的,因爲我們正在把它的另一個間接這是不合法的,除非當案件變量聲明那樣:

int a = 4; 
int *b = &a; 
int **c = &b; 

編輯2:您可以scanf("%d", &a)作爲證明其表示存儲在中的未地址的值。

+0

間接運算符的操作數必須是指向類型的指針。 – Sanoob

+0

數組名稱是特殊的,它們像指針一樣行爲。 –

+2

*它將值存儲在&a *中的一個或一個地址中,而不是必需的。 'a'可以存儲在一個寄存器中,或者在某些情況下它可能完全被優化掉。 'a'不是一個地址,它是一個'int'變量,編譯器*可能會使用一個內存位置來實現。 – Caleb

回答

2

當變量是int類型(而不是int *),編譯器知道它需要做的間接爲你,你不應該試圖讓它做。也就是說,當你有int a = 10;時,編譯器將該值存儲在由&a(忽略寄存器)表示的存儲器位置,並且它知道當你編寫printf("%d\n", a);時,它需要自動獲取存儲在&a處的值,而不需要考慮關於告訴它解除引用。

當變量的類型爲int *(例如,int *p),有兩種方法可以讀取值:即在p

  • 舉行

    • 取的值(地址)獲取的存儲在p

    地址保存的值這是兩個不同的操作,所以需要兩個符號:

    int a = 10; 
    int *p = &a; 
    int *q = p; 
    int r = *p; 
    

    當然,p也有自己的 地址。

  • +0

    編譯器在哪種情況下對你進行間接引導? –

    +0

    在你編寫'a = 10;'或'int s = a;'的上下文中 - 它知道'a'被存儲在一個地址中,該地址是'&a'(除非該值在寄存器中,不會使事情複雜化)。但是,當我編寫'a'時,不需要告訴編譯器,我希望您獲取存儲在'a'存儲的地址中的值。 –

    +0

    所以,我是對的,編譯器自動爲所有標量值生成第一級間接尋址,無論它是數組還是簡單變量,這就是指針的工作原理。 –

    3

    直到某一點你是對的:a存儲int和住在地址&a

    但間接只能用於指針。所以,你可以做任何的

    int a = 10; 
    int *p = &a; 
    printf("%d", a); 
    printf("%d", *(&a)); 
    printf("%d", *p); 
    
    0

    它不是一個真正明確的問題是什麼在這裏,所以我就解釋一下情況。

    每一個(全局)變量位於內存中某個位置。當它被賦值時,該值將在變量位置的內存中。

    如果您在C中使用該變量,則實際上使用存儲在變量位置處的值。看到這個

    的一種方法是,如果需要&的對象的地址,和*解除引用(如下)的指針,然後* &a是一樣簡單地a

    0

    當你

    int a = 10; 
    

    編譯器分配足夠大小的內存來容納一個int。這個位置必須是,其標識爲(這是在這個特定的地方,即地址)和標記爲(該位置被稱爲a)。然後它存儲該點的數據。該標籤可讓您輕鬆訪問。如果語言的設計方式只能通過指針訪問位置(即將它們解引用以獲取值),那麼將很難。

    你可以說它的樣子,你住在一塊可以用精確的經度和緯度精確定位的土地上。但最好保留該位置的名稱,MyHouse等,而不是每次都提及緯度/經度。名字和longi/lati都指向相同的東西。

    a是標籤。 &a更喜歡longi/lati

    編輯:關於int b[10]。數組名稱不是普通標籤。它們也作爲指針,因此您可以使用*來解除引用它們

    0

    首先,您不能在任何沒有指針類型的內容上使用間接運算符。

    請記住,C中的聲明基於表達式的類型,而不是對象;申報

    int a = 10; 
    

    說,表達a的類型爲int,並且將評估爲的10值(至少直到有人一個不同的值分配給它)。所以,當你寫

    printf("%d\n", a); 
    

    編譯器知道檢索存儲在綁定表達式a的存儲單元的值。把它想象成一個直接訪問

    現在考慮的聲明

    int *p = &a; 
    

    這個聲明說,表達*p的類型爲int,並將評價到任何的p當前指向(在這種情況下的數值,*p將評估爲10,因爲p被初始化爲地址a);間接運算符是聲明的一部分(並且與聲明者*p綁定,而不是類型說明符int)。變量p是一個指針爲一個整數,它存儲另一個整數變量(在這種情況下,變量的地址a地址。因此,如果我們要訪問的整數值,我們必須解引用p

    printf("%d\n", *p); 
    

    這是一個間接訪問值10;而不是通過變量a訪問它,我們通過p訪問它,它指向a