2013-10-23 66 views
1
char *x[4] = { "ffg", "fgf", "kkk" "mmm"}; 
int *x1[4] = { 1, 2 ,3 , 4}; 

如果我創建字符指針的陣列上方其編譯細而如果我創建整數指針陣列中第二行中提到我正在錯誤創建字符指針陣列和整數指針

'initializing' : cannot convert from 'int' to 'int *' 
如所提到的

語法對於字符的工作方式如何,但不適用於整數。請解釋任何人。

+0

要增加混淆,如果使用不同的文字(即零)初始化整數指針數組,它將「工作」。這是因爲零也轉換爲指針。你實際上是否有一個整數指針數組(即你打算做什麼)? – Damon

+0

恩,你的語法不適合人物。字符版本是'char * x [4] = {'f','f','g'};',並且這與'int'版本有相同的問題。 –

回答

10

"ffg"具有類型char* ,而1具有類型intint*)。希望你現在看到這個問題。

:好的,從技術上來說it's char[4] in C,但是這暗含地衰變爲char*。在C++中,類型爲const char[4],您應該使用get a warning or an error from the compiler

+4

我被控制''ffg「'有'const char'[4]' – juanchopanza

+1

@juanchopanza:我確定有人會跳進來糾正,但是你超級快。 :)讓我想一想,如何在不增加混淆的情況下對其進行重新說明。 – NPE

+1

在[]用於數組訪問的上下文中使用[1]進行腳註是不必要的混淆 - 將您的筆記內嵌或者只是在沒有註腳的情況下進行註釋。 –

2

1, 2 ,3 , 4是整數,而不是指向ints的指針。你可能想要做。像這樣投射:

int *x1[4] = { (int *)1, (int *)2 ,(int *)3 , (int *)4}; 

將使錯誤消失,但解除引用將導致UB。

int i1=0, i2=0, i3=0, i4=0; 
int *x1[4] = { &i1, &i2, &i3, &i4 }; 

字符串文字(如"ffg""fgf"等)保持在只讀位置(依賴於實現的),並且具有鍵入char []

既然你標記C++,你可以嘗試:

#include <iostream> 
#include <typeinfo> 

int main() 
{ 
    char arr [5] = "test"; 
    char *arr1 = "test"; 
    std::cout << typeid(arr).name() << std::endl; 
    std::cout << typeid("test").name() << std::endl; 
    std::cout << typeid(arr1).name() << std::endl; 
} 

輸出:

A5_c 
A5_c 
Pc 

正如你所看到的字符串字面量衰減到指針由NPE表示,雖然它的類型是char[5]

+0

字符串文字是否存儲在只讀存儲器中取決於實現。 –

+0

@ShafikYaghmour - 謝謝澄清:) – Sadique

3

int *x1[4] = { 1, 2 ,3 , 4};你不能做到這一點,你存儲整數,而不是整數的指針,存儲整數指針數組中這裏是如何PROCEDE:

int *x1[4] ; 
int i , j , k , l; 
x1[0] = &i; 
x1[1] = &j; 
x1[2] = &k; 
x1[3] = &l; 
+0

@EricB沒有理由相信該數組的範圍比整數大。 – juanchopanza

0

沒有什麼錯指針數組。 我認爲你不明白編譯器告訴你什麼。

語法沒有問題。這是語義不好。

{1, 2, 3, 4}int[4]類型,但是您將它指定爲int*[4],這是不可能的。

錯誤是一個initializing錯誤。它告訴你解析器對你的代碼是可以的,但語義分析器並不是因爲intint*不一樣。