2011-07-16 242 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