2011-05-25 140 views
9

我有一個int指針數組int* arr[MAX];,我想將其地址存儲在另一個變量中。我如何定義一個指向指針數組的指針?即:指針數組指針

int* arr[MAX]; 
int (what here?) val = &arr; 

回答

12

應該僅僅是:

int* array[SIZE]; 
int** val = array; 

沒有必要對賦值運算符的右側上array使用地址的運營商因爲數組衰變爲隱含指針。

+0

但我想要一個指向數組的指針,而不是數組本身。 – moteutsch 2011-05-25 20:57:28

+0

@moteustch那麼,你有一個指向數組的數據的指針,這個數據幾乎是一樣的。 – 2011-05-25 20:58:45

+4

是的,'val'是一個指向'int'指針數組的指針(從語義上講)...如果你取消了val的引用,你將最終得到指針數組,也就是說, * val)[INDEX]'。因此,由於'val'將地址保存到'int *'數組的開始處,因此它是指向數組的指針。 – Jason 2011-05-25 21:01:39

1

IIRC,數組是隱式轉換爲指針,所以這將是:

int ** val = arr; 
+0

我相信這是要在編譯的錯配型引發和錯誤,因爲'arr'實際上是一個類型的「數組的指針,TO- int'而不是「int指針」 – Jason 2011-05-25 20:53:44

+0

數組可以轉換爲指針......但不是相反的方向,而且指針到數組也不能隱式轉換爲指針指針。 – Kos 2011-05-25 20:55:20

+0

但是如果一個數組可以轉換爲一個指針,那麼原來的arr就和'int ** arr'一樣嗎?那麼'&arr'就是'int ***',不是? – moteutsch 2011-05-25 20:56:14

0

據我所知,目前還沒有具體類型c「整數數組」,因此它的不可能有一個特定的指針。你唯一能做的就是使用一個指向int的指針:int*,但是你應該考慮int的大小和你的數組長度。

+0

int []'是一個整數數組,它與* int *不同*,但在用作函數參數或指針算術完成的上下文中會隱式衰減爲'int *'。 – dmckee 2011-05-25 20:53:01

+0

C肯定有數組類型,它們不等於指針類型,如果這就是你的想法。嘗試編譯'int main(){int a [1] = {0}; int i; a =&i;返回0; }' – 2011-05-25 20:54:12

+0

數組類型和指針類型之間最重要的區別是它們如何響應'sizeof'。 – Kos 2011-05-25 21:02:03

19

正確的答案是:

int* arr[MAX]; 
int* (*pArr)[MAX] = &arr; 

或者只是:

 int* arr [MAX]; 
typedef int* arr_t[MAX]; 

arr_t* pArr = &arr; 

最後一部分內容爲「帕爾是一個指針,指針類型爲int的MAX元素的數組」。

在C中,數組的大小存儲在類型中,而不是數值中。如果你想讓這個指針正確地處理數組上的指針運算(如果你想使二維數組超出這個數組並且使用這個指針遍歷它),你通常不幸的需要有嵌入指針類型中的數組大小。

幸運的是,既然C99和VLA(甚至可能早於C99?)MAX可以在運行時指定,而不是編譯時間。

-1

根據這個源http://unixwiz.net/techtips/reading-cdecl.html,通過使用「向右走就可以了,向左走的時候,當你必須」的規則,我們得到了以前的答案給出的聲明如下2個含義 -

int **val ==> val is a pointer to pointer to int 
int* (*pArr)[MAX] ==> pArr is a pointer to an array of MAX length pointers to int. 

我希望上面的意思是有道理的,如果他們不這樣做,那麼仔細閱讀上面提到的來源可能是個好主意。

現在應該清楚,第二個聲明是moteutsch正在尋找的聲明,因爲它聲明瞭指向數組的指針。

那麼,爲什麼第一個也工作?請記住,

int* arr[MAX] 

是整數指針的陣列。所以,val是一個指針,指向在int指針數組中聲明的第一個int指針。

0

我相信答案是簡單的:

int **val;<br> 
val = arr;