2017-03-04 89 views
4

我相對比較新的編碼方式,並且有一些問題理解指針如何與數組結合(他們自己我理解)。在C++中使用一個指向char數組的指針

我的理解,它可能創造像指針數組:

#include <iostream> 
using namespace std; 

int main() { 
    int i; 
    int *pArr[10]; 
    pArr[0]=&i; 
    return 0; 
} 

在教程後來我發現下面的代碼:

#include <iostream> 
using namespace std; 

int main() { 
    char *names[4] = { 
     "name A", 
     "name B", 
     "name C", 
     "name D" 
}; 

for (int i = 0; i < 4; i++) { 
    cout << names[i] << endl; 
} 
return 0; 
} 

爲什麼,我可以將多個字符,或者說一個字符串,比如將「name A」指向一個指向char的指針。

我不應該答:

只能一個字符的地址分配給每個那4個三分球,我創建的。

和b:

僅能夠分配的指針,到一個單字母(a炭),向每一個。

我希望有人能夠在一定程度上幫助清除我的困惑。

+1

'「name A」''的類型實際上是'const char *'。 –

+1

1.請閱讀'const' 2.'使用std is bad' - 谷歌也是如此 –

+0

請看這裏的一些有用的編譯器警告:http://coliru.stacked-crooked.com/a/f67971a42cebd76f –

回答

1

每個char *指向字符串中的第一個字符。當你看到嵌入「mystring」的文字字符串時,則char *指向「mystring」的「m」。

的COUT命令是建立這樣,當你把它傳遞一個char *變量,它打印從存儲器地址開始,直到達到一個零字節(二進制值0,而不是寫字符「0」)的所有字符。

這樣做的最終結果是您可以實際增加char *指針以獲得較短的字符串。例如如果將1添加到指向「mystring」的指針,它現在將指向「ystring」。所以你的假設基本上是正確的,char *指向一個字符,而不是整個單詞。

3

在C(和C++)中,字符串文字(例如"name A"等表達式)的類型爲const char*。在引擎蓋下,這些字符串字符存儲在二進制文件的數據部分的某處。並且字符串文字用指向這些字符中第一個的指針代替。所以,下面的語句

char *names[4] = { 
    "name A", 
    "name B", 
    "name C", 
    "name D" 
}; 

指示編譯器在數據段分配四個字符串,然後到四個指針分配給指針數組names

+5

在C++中,可以將字符串常量賦給const char *,但在C中也可以將它賦給char *。但是,這不是*字符串文字的類型 - 字符串文字不是字符指針,它們是字符數組。 – dasblinkenlight

+0

其次......'std :: cout << typeid(「foo」).name()'打印「char const [4]」。所以正確的解釋是它是一個字符數組,編譯器會用指向第一個字符的指針替換數組。 – zett42

+0

字符串文字類型是'const char [7]',而不是'const char *'只能在某些情況下從數組轉換爲指針prvalue –

2

您已經創建了一個4個指向char的指針數組。

「字符串litteral」是一個字符數組。而這個數組的地址是一個指向char的指針。所以沒問題把它放在你的指針數組中。

現在你的代碼編譯了嗎?還是它抱怨混合char *和const char *?這將是另一個問題,已經有很多答案了。SO

+0

在C++ 11之前,允許(但不贊成)字符串文字到'char *' –

6

這是編譯器提供的一種快捷方式,它使程序員可以更輕鬆地在其代碼中包含字符串。

當寫字符串文字"name A",編譯器準備七個字符陣列爲您:

const char hidden0[] = {110, 97, 109, 101, 32, 65, 0}; // "name A" 

前六個數字對應於字符串中的符號的字符代碼。最後一個字符是零 - 所謂的空終止符。

的編譯器爲所有四個字符串文字一樣,所以你的數組初始化程序是這樣的:

const char *names[4] = { 
    &hidden0[0], 
    &hidden1[0], 
    &hidden2[0], 
    &hidden3[0] 
}; 

hiddenK是對應的字符串字面量創建數組。它沒有名字,但是編譯器知道它的地址,並將它放在name[]數組中。

相關問題