2011-07-16 137 views
0

我認爲這是一個相當簡單的問題...我試着找到具體的東西,不能。的代碼:指針和字符數組

#include <iostream> 
using namespace std; 

int main() { 
    char * veggie_burger = "delicious"; 
    cout<<endl<<veggie_burger<<endl; 
    for (int count = 0; count < 9; count++){ 
     cout<<veggie_burger[count] 
      <<" @: " 
      <<&veggie_burger[count] 
      <<endl; 
    } 
    cout<<&veggie_burger; 

    return 0; 
} 

這將輸出

美味
d @美味
ë@ elicious
升@ licious
I @ icious
Ç@ cious
I @白條
ö@ OU中
我@
s @ s
001DF7D4(或任何地方)]

&veggie_burger[n]&veggie_burger之間的區別究竟是什麼?指針是不是應指向&veggie_burger[3]存儲'l'的內存中的位置,而不是在'l'處啓動字符序列?

回答

4

veggie_burger[n]是完全一樣*(veggie_burger+n),所以&veggie_burger[n]意味着veggie_burger + n,或一個指針n個字符。它的類型爲char*,因爲它是一個字符的地址。

&veggie_burger另一方面是指針的地址。它有類型char **

+0

啊,我看到它幾乎清除了......謝謝! – Dave

2

在這種情況下,&veggie_burger的類型爲char **,它具有指針的地址。換句話說,指針在內存中的位置。

&veggie_burger[n]是該數組的第n個成員的地址。不是它的價值。

不要將指針與數組混淆。例如:

char veggie_burger[] = "delicious"; 

這是一個數組,並且veggie_burger == &veggie_burger == &veggie_burger[0]

+0

即使在數組的情況下,'const'從哪裏來,而且'&veggie_burger'與'&veggie_burger [0]'是不一樣的。 –

+0

不是文字常量? –

+0

'veggie_burger'不是'const char *',是嗎? –

0

當您發送char *cout時,編譯器會識別並打印該字符串。當您發送char **cout時,會打印char *的數字地址。

由於&veggie_burgerchar **,你得到的地址,而與&veggie_burger[3]你得到一個字符串(跳過前面3個字節的餘數)。

1

首先,

char * veggie_burger = "delicious"; 

是一個壞主意,最不推薦使用;改用:

const char * veggie_burger = "delicious"; 

&veggie_burger只是veggie_burger的地址;它與它指向的字符串文字無關。

&veggie_burger[n]中有兩個部分,第一veggie_burger[n];它被評估爲字符串文字的nth元素。第二是&<element>,這意味着nth元件的地址。

話雖如此&veggie_burger[3]存儲地址的信l。即

&veggie_burger[3] ==> (veggie_burger + 3) 
+0

酷感謝,我還是相當新...注意到未嘗還,也許這是關從原來的問題的話題,但爲什麼它最過時? – Dave

+0

@Dave,我的意思是**主要** :)。因爲「美味」(當用作字符串文字而不是數組時)存儲在**只讀**區域中。所以指向它的指針也應該是隻讀的(即'const char *')。這不是主題;如果你不小心修改它說'veggie_burger [3] ='a';'那麼它會導致未定義的行爲或崩潰。所以一定要確保你使這些'const char *'。還要注意這是有效的(因爲它是數組):'char veggie [] =「美味」;' – iammilind