2010-01-25 64 views
1
char x[16]; 
int y = 42 + 256; 
char* p = &y; 
int* q = p; 
char** r = &p; 
printf("%d %d %d\n", p, q, r); 

爲什麼r的值總是比p和q小12個單位?謝謝!指針指針的作用是什麼? char **

+4

您應該使用'%p'格式打印指針。 http://stackoverflow.com/questions/2129128/memory-allocation-in-c/21​​29610#2129610 – 2010-01-25 04:29:01

+1

我會避免短語「雙指針」。它含糊不清。使用類似指針指針的東西來清楚。 – scobi 2010-01-25 04:31:42

+0

@scott作出了改變 – user133466 2010-01-25 14:41:02

回答

3

雙指針是指向指針的指針。

爲什麼r的值總是12個單位 小於p和q?

如果移動到另一個運行時或另一個操作系統/編譯器,那麼它不會保留。

6

您打印的內容有三個內存地址。由於這些分配在堆棧上(假設它們不是全局的),我會期望類似於:

2030 2026 2022 

假設32位機器和4字節指針。

*是指向指針的指針。如果你使用正確的類型,它會變得更清晰。

char *str = "hello world"; 

str在這種情況下是指向以空字符結尾的字符序列的指針。

char **p = &str; 

表示指向指向字符串的指針的指針。

我說「正確的類型」,因爲你有,例如:

int y = 42 + 256; 
char* p = &y; 

真的,這應該是:

int *p = &y; 

通常的原因在這種情況下使用char *被檢查個別字節。

0

在您的代碼中,與p或q相比,不能保證r的值。既然你說它更小,我猜這些是函數中的自動變量。你看到的事實是,編譯器(可能)爲每個指針分配4個字節,並且你已經分配了3個字節,這可以達到12個字節 - 這幾乎是個意外,但不是C標準要求或類似的東西。舉個例子,在64位系統上,很可能你會看到不同的數字。

char **是指向char的指針。一個典型的用法是創建一個動態的字符串數組。

typedef char *string; 

string *string_array; 

如果你把那些拼在一起,上面寫着:char **string_array;

4

讓我們來分析你的代碼逐行:

char x[16]; 

,如果你開始喜歡的東西可能更容易跟隨x是「char」的「數組[16]」,即它可以存儲16個char值。順便說一句,您在代碼中完全不使用x

int y = 42 + 256; 

yint等於298

char* p = &y; 

p是一個指向char,和你想的int的地址分配給它。如果你想要一個指向int的指針,你應該聲明pint *p,或者如果你想要一個通用指針,你應該聲明它爲void *p。如果你真的想做你正在做的事情,你需要演員:char *p = (char *)&y;p初始化的結果是p指向y的最低尋址字節。

int* q = p; 

qint *型的,並且是pchar *類型。同樣,你需要演員。假設投,標準說,這對你的最後兩個語句:

一個指向對象或不完整的類型可以被轉換成一個指向不同的對象或不完整的類型。如果生成的指針未針對指向類型正確對齊,則行爲未定義。否則,當再次轉換時, 結果應與原始指針相等。

所以,最終效果就好像你這樣做了:int *q = &y;。所以,q包含地址y

char **r = &p; 

rchar **類型。 &p類型爲int **。同樣,您至少需要演員陣容,但不能將int **轉換爲char **。我不知道你爲什麼使用char **。如果你想在變量中使用p的地址,則應該使用void *,或者假設你真的想要char,請使用char *

printf("%d %d %d\n", p, q, r); 

要打印與%d格式說明指針。 %d需要一個int,而不是一個指針。您應該使用%p並將p,qr改爲void *進行打印。

假設我理解你想要做什麼,我改寫了你的程序:

#include <stdio.h> 

int main(void) 
{ 
    int y = 42 + 256; 
    void *p = &y; 
    void *q = p; 
    void *r = &p; 
    printf("%p %p %p\n", p, q, r); 
    return 0; 
} 

在我的電腦,這個打印:

0x7fff5fbff7dc 0x7fff5fbff7dc 0x7fff5fbff7d0 

pq顯然是相等的,r是對象的地址p

如果我沒有正確理解你的意圖,你必須告訴我們你想做什麼以及爲什麼。