2013-10-21 22 views
3

我是用指針坐立不安從指針thingy.graduated - >指針數組 - >函數指針 - >指針的指針..前進指針令人費解的語法

這裏是我停留在什麼...大多錯綜複雜句法。我想我有一個整數數組。

int arr[4] = {1,2,3..}; 

也我有指針

int* ptr[4]; 
ptr[0] = arr; 

這裏的陣列的ptr [0]將指向1 和PTR [1]將指向某些其他位置

這工作完全!!

現在考慮上述背景我試過這個。

char* crr[4] ={"C","C++","C#","F#"}; 
char** btr[4]; 
btr[0] = crr; 

它作爲指針在both的其他元素中指向crr中的另一個指針元素。

然後我試了一下。

char* crr[4] ={"C","C++","Java","VBA"}; 
char** btr[4]= &crr; // Exception: cannot convert char* [4] * to char**[4] 

,但是當我這樣做它的工作原理:o

char* crr[4] ={"C","C++","Java","VBA"}; 
char* (*btr)[4]= &crr; 

我不明白最後兩個場景。在RHS上使用括號請解釋。

+1

N.B.在C++中,''C''是2'const' char *類型的*數組,並且在C++ 11中已經去除了轉換爲char *(w/o'const')的*指針。 – dyp

回答

2

除了當它是sizeof或一元&運營商的操作數,或者是文字被用來初始化另一個數組中的字符串一個聲明,類型爲「T的N元素數組」的表達式將被轉換(「衰減」)爲「指向T的指針」類型的表達式,並且該表達式的值將是該元素的第一個元素的地址陣列。

當編寫

btr[0] = crr; 

表達crr具有類型 「的char * 4-元件陣列」;因爲它不是sizeof&運算符的操作數,所以它將轉換爲類型「指向char *」或char **。這匹配btr[0]的類型。

但是,當寫

char** btr[4]= &crr; 

表達crr&操作者的操作數;因此表達式&crr的類型是「指向4個元素的數組char *」或char *(*)[4]

括號是必要的,因爲後綴[]運算符的優先級高於一元運算符*;表達式*a[i]將始終被解析爲*(a[i])。因此,

T *a[N];    // a is an N-element array of pointer to T 
T (*a)[N];    // a is a pointer to an N-element array of T 
T *(*a)[N];   // a is a pointer to an N-element array of pointer to T 

這同樣適用於指針和功能真:

T *f();    // f is a function returning a pointer to T 
T (*f)();    // f is a pointer to a function returning T 
T *(*f)();    // f is a pointer to a function returning pointer to T 
+1

謝謝約翰....這說明支架東西...現在清晰的照片...我猜我必須處理語法。 – Haswell

3
char** btr[4]= &crr; // Exception: cannot convert char* [4] * to char**[4] 

這是試圖從一個指針初始化一個數組(指針指針),你不能這樣做。如果你想初始化爲指向crr(在你的第一個例子)的第一個元素,那麼你會做

char** btr[4]= {crr}; 

最後一個例子是聲明一個指向數組的指針(指針),並初始化它從一個兼容的指針。

請注意,您的原始數組應該是const char *而不是char *,因爲它包含指向(常量)字符串文字的指針。

1

讓我們來看看你的定義:

  1. 字符的大小4 *

    char* crr[4] ={"C","C++","Java","VBA"};

  2. 陣列焦炭的大小爲4的數組**

    char** btr[4]

  3. 字符指針的大小爲4的數組*

    char* (*btr)[4]

現在你想分配給Array of size 4 of char*Array of size 4 of char**他們是不同類型的,所以你,很明顯,有一個錯誤。還有另外一個規則(它是支配的):你不能在沒有大括號的情況下初始化數組,所以數組應該用新數據初始化而不是指向其他數組的指針。

而且你absoulutely法律指針類型Pointer to an array of size 4 of char*到您的陣列地址可分配