2010-07-18 111 views
2

我學習C語言編程和我有指針一個簡單的問題...學習C - 指針和內存尋址

我用下面的代碼玩弄指針:

#include <stdio.h> 

int main (int argc, const char * argv[]) { 

int * c; 

printf("%x\n",c); 
return 0; 
} 

當我打印C的值,我得到一個0。但是,當我打印& C(即輸出(「& X \ n」,&三)我得到內存中的地址...

我不應該打印時要在內存中獲取地址e指針(即的printf( 「%X \ n」 個,C)?

--- 編輯 ---

#include <stdio.h> 
#include <stdlib.h> 

int main (int argc, const char * argv[]) { 

    char * a = malloc(11); 
    printf("String please\n"); 
    scanf("%s",a); 
    printf("%s",a); 

} 

的問題是,爲什麼的printf( 「%S」,一個)返回字符串,而不是存儲在一個地址?

不應該使用* a來跟隨指針,然後打印字符串嗎?

+1

您還沒有初始化的指針打印單個字符,所以它的價值可以是任何東西。 – 2010-07-18 16:59:53

回答

11

您當前的程序不正確。您在首次使用前定義變量並且不要設置值。初始值不保證爲c,但你很幸運,它等於0。這意味着c指向無處。當您打印&c時,您打印變量c本身的地址。所以實際上兩個版本都打印地址

+0

所以,指針本身在內存中有一個地址,這將是&c。指針本身存儲一個地址,這將是c? – AlexBrand 2010-07-18 17:09:30

+1

@alexBrand是的,每個變量都有一個地址,即使它是指針。你可以定義指向int的指針:'int ** pc =&c;' – Andrey 2010-07-18 17:11:43

+0

非常感謝。所以基本上這個指針被初始化了,但它沒有指向任何地方......這是因爲運氣還是自動初始化爲NULL? – AlexBrand 2010-07-18 17:14:30

0

int * c;如果您輸出c的值,則會返回一個值,該值應被解釋爲整數值的內存地址。在你的例子中,它可能是0或者完全不同的東西,因爲你沒有初始化c。

如果您打印& c,您將獲得指針c(存儲在堆棧中)的內存地址。

0
#include <stdio.h> 

int main (int argc, const char * argv[]) { 

int * c; 
int a=10; 
c = &a; 

printf("%x\n",c); 
return 0; 
} 

這可能會說明將int指針指向內存中的某些內容時會發生什麼。

1

printf實際上是一個相當複雜的函數,可以通過給它一個正確的格式說明符來做各種各樣的技巧。

在你的字符串例如:

printf("%s", a) 

的「%s的」告訴printf的下列變量應被視爲一個字符串函數。在C中,字符串是指向一個或多個char的指針,由包含0的char終止。這是一個非常常見的請求,這就是printf支持格式說明符「%s」的原因,它觸發了相對複雜的行爲。如果要打印包含在字符串指針的地址,你必須使用你發現較早的格式:

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

它會告訴printf的處理的內容作爲一個無符號整數,並在基地16打印。

* a只是a指向的值,它只是單個字符。

您可以用

printf("%c", *a); 
+0

非常感謝。所以基本上printf會指出你想要打印的內容,然後決定它是否應該跟隨指針? – AlexBrand 2010-07-18 18:38:18

+0

這是正確的。 – 2010-07-18 20:00:42

+0

我想補充一句,C假設你知道你在做什麼,並且不會試圖阻止你在腳下射擊自己。例如: int i = 10; printf(「%s」,i); 也就是說,「聲明一個整數變量i,將它設置爲10,然後打印出來,就像它是一個字符串一樣對待」 這是有效的C語法,並且會編譯時沒有錯誤(儘管幾乎所有的現代編譯器都會發出警告)。當你嘗試運行這個程序時,你會得到一個分段錯誤,因爲10對於一個內存地址來說不是有效的值。 – 2010-07-18 20:21:12