2012-10-31 121 views
2

我想了解下這整個指針和間接引用的事情我幾乎得到了它,但碰到了非常簡單的代碼,這導致我不明白:Ç初學者,指針及提領

char *ptr = "Characters"; 
char val = *ptr; 
char *chrptr = &val; 
printf("Value under character pointer is: %p/%c\n", &val, val); 
printf("Dereferenced character pointer: %p\n", chrptr); 
printf("Array pointer: %p\n", ptr); 

現在,據我所知,執行前,ptr == chrptr == &val,但實際上ptr != chrptr == &val。爲什麼是這樣?

+1

第一行是C.差應該是'字符常量* PTR = 「人物」;'。確保你真的明白這一點。 (但這與你的問題無關。) –

回答

4
char *ptr = "Characters"; // returns a pointer to 'C' 
char val = *ptr; // dereferences the pointer to 'C' and copies 'C' into val 

VAL有它自己的內存位置,所以 VAL地址都會不同

char *chrptr = &val; //chptr points to val. A different memory location. 
1

當您分配給char時,會進行復制。所以該副本的地址不會等於原始字符串。

相比之下,當你分配給一個指針時,你正在分配原始字符串的地址(或者它指向的指針)。

1
ptr == chrptr == &val 

只有chrptr == &val部分是正確的,但ptr != chrptr。這是因爲val是來自ptr的第一個字符即'C'副本。副本存儲在與原始文件不同的位置,因此其在內存中的地址不同。

0

字符串「字符」由編譯器定位在一個存儲區中,但變量「val」(等於'C')位於其他存儲區中。這就是爲什麼& val不等於「ptr」。

0

沒關係所有的間接和局部變量,但你的問題歸結到同這一個:

int a = 1; 
int b = 1; 

兩個ab具有相同的價值,但他們明顯不同的對象,所以他們有不同的地址。 valptr[0]也是如此。

0

您的代碼執行以下操作。

char *ptr = "Characters"; //- Store "Characters" in read only data section and assign the address to variable to `ptr`. 

char val = *ptr; //- Assign the value 'C' (i.e 67) to stack variable val. 

char *chrptr = &val; //- Assign the address of variable val to chrptr 

這裏val是一個堆棧變量,因此它的地址將在堆棧地址範圍內。但字符串文字存儲在只讀數據部分。並且只有ptr保存那個地址。

因此很明顯&valptr是兩個不同的地址。

2
char *ptr = "Characters"; 

     +---+---+---+---+---+---+---+---+---+---+----+ 
ptr -> | C | h | a | r | a | c | t | e | r | s | \0 | 
     +---+---+---+---+---+---+---+---+---+---+----+ 

char val = *ptr; // you copy 'C' by value from the array, ptr is still pointing 
       // where it originally pointed 

// &val is somewhere else in memory so 

char *chrptr = &val; 

      +---+ 
chrptr -> | C | 
      +---+ 

,如果你想有chrptr地步ptr指向然後寫

char* chrptr = ptr;