2012-12-18 96 views
0

我有以下代碼:指向N個數組的靜態指針,還是指向N個靜態數組的指針?

const int N=3; 
static double * p[N]; 

是否p爲一個靜態指針指向一個N維double數組,或者與放置靜態指針的每個元件N維數組?

而且我發現下面的更改失敗編譯和不知道爲什麼......

int N=3; 
static double * p[N]; 
+4

只是基於這個和你以前的問題提示:你需要停止將'static'作爲類型的一部分。不是。你計算出事物的類型(在這種情況下「N指針的數組爲double」),然後你可以說它是靜態的。無論構成什麼對象都將具有靜態存儲持續時間。如果你的類型包含指針,它們指向的內容不是對象的一部分。它們完全是不同的對象,不一定是靜態的。你的問題中的聲明根本不會產生任何'雙'。它只是創建一些指針。這些指針是靜態的。 –

+0

@sftrabbit現在我更清楚「靜態」不是該類型的一部分。例如。 「int * a,b;」聲明「a」爲指針,而「b」聲明爲「int」;然而,「int static a,b;」聲明「a」和「b」具有「靜態」持續時間。我對嗎? –

+0

那麼'a'是一個「int指針」,而'b'只是一個「int」。但是,在第二個例子中,'a'和'b'都是靜態的。 –

回答

2

p表示指向N維雙數組的靜態指針,還是指向每個元素代表靜態指針的N維數組?

幾乎第二選擇一個N大小的數組,每個元素代表一個靜態指針。請注意從「N維」到「N大小」的更改。謝謝@David。

而且我發現下面的更改失敗編譯和不知道爲什麼......

陣列需要爲他們的大小不變的整數。在刪除N的「常量」後,在編譯時p的大小不確定。

+0

@大衛我的講師有時也會使用這個模棱兩可的術語。它也讓我困惑。 –

+0

哎呀@大衛,修好了,謝謝。 – imreal

+0

const限定的對象不是編譯時常量,它們只是在初始化後更改後導致未定義行爲的對象。那些數組是VLA,它們都是(用'gcc -std = c89 -pedantic'編譯的)。事實上,數組並不需要C99中的常量 - 通過C11,VLA支持不是強制性的。 – effeffe

1

p是3個指針靜態數組double秒。

編譯器要求編譯時知道數組的大小,這就是爲什麼數組大小聲明只能使用const int而不使用int

0
cdecl> explain static double *p[10]; 
declare p as static array 10 of pointer to double 

還有cdecl.org在線獲得這種幫助。