2010-09-02 79 views
1

我有一個數組爲:指針間接混亂

int x[3][5]={ 
     {1,2,3,4,5}, 
     {6,7,8,9,10}, 
     {11,12,13,14,15} 
     }; 
  1. 是什麼* X是指什麼?
  2. *(* x + 2)+5參考「8」。這是怎麼發生的?
  3. 是*(* x + 2)與*(* x)+2相同嗎?
  4. 如果我這樣做:

    * n =&x; 指針n指向哪裏?如果它只有x而不是&那麼它就是基地址。現在是什麼?

+5

看起來很像功課。你可以請至少嘗試自己先回答嗎? – x4u 2010-09-02 15:11:04

+0

我可以很容易地通過運行該程序來做到這一點。我需要一個親愛的解釋。 – 2010-09-02 15:13:26

回答

4
  1. *x是取消引用操作。換句話說,「給我什麼x指向」。由於這是一個數組(數組),所以dereferencing x會給你第一個數組。這相當於x[0]的數組訪問語法。

  2. *(*x+2)+5相當於x[0][2] + 5,它給你8.這是因爲: *x相同x[0](參見#1)和*(x + 2)相同x[2]。一旦你完成了兩個解引用,你已經從一個數組的數組(類似於一個雙指針)到一個數組(單指針)到一個實際的數字(第一個數組中的第三個條目)。然後,它只是3 + 5 = 8.

  3. *(*x+2)相當於x[0][2](參見#2),它是3(數組中的第三個元素)。然而,*(*x) + 2給你x[0][0] + 2(數組中的第一個元素加上2),這是1 + 2 = 3。同樣的答案,但獲得它的方式非常不同。

+0

你是說如果我有*(* x + 1),我會先找到它指向的地方?即x [0] [0],然後加1到它指向的值?不會和*(* x)+1相同嗎? – 2010-09-02 15:30:07

+1

@fahad *(* x + 1)將是x [0] [1],它是第一個數組中的第二個元素。 *(* x)+1表示取x [0] [0]並將1加1。再次,在你的具體情況下,它們都等於2。 – Bob 2010-09-02 15:40:54

6

*x指的是第一個數組({1,2,3,4,5}),等同於x [0]。將x添加到下一個數組中,因此*(x+1)將引用第二個數組,並且將等同於x [1]。因此

*(*x + 2)是第一陣列中的第三元素,其是3。這意味着*(*x + 2) + 5等於8

括號問題很多,例如*(*(x+2))將是第三陣列中的第一個元素。

*(*x + 2)的結果與*(*x) + 2的值相同,但不使用數組中的相同元素。

+1

'* x'不是一個指針,它是一個數組。在某些情況下,它可能衰減到指針,但並不總是如此。例如,嘗試'sizeof * x'。 – 2010-09-02 15:33:30

+0

好點,我會改變措辭。 – WildCrustacean 2010-09-02 15:34:30

1

x是一個int**所以它就像是如果你有第一層指針,並且他們每個人都指向一個int*(所以一個int的數組)。

當您編寫*x時,您將獲得包含指向多維數組第一行的地址的地址。

所以,如果你參考(*x + 2),如果它像引用你的第一行數組,然後加2到地址:你獲得第一行的第三個元素的地址。但是由於這仍然是一個指針,所以您需要添加一個外部的*(*x+2)來精確地獲取第一行的第三個元素。

+0

'x'不是'int **'。 'x'永遠不會衰變爲'int **'。 – 2010-09-02 15:32:43

1

認爲它是這樣的:

typedef int Int5[5]; 
Int5 x[3]; 

x是具有3個元素的數組。這三個元素中的每一個都是5個整數的數組。

  • * x是指什麼?

x相同「& X [0] so * X is the same as X [0]`是第一5個元素的數組。

  • *(* x + 2)+5表示「8」。這是如何發生的?

*x爲x [0],並且x+2&x[2]所以*x+2&x[0][2]是和*(*x + 2)x[0][2]這恰好是3.添加五到,對於8

  • 是*(* X + 2)與*(* x)+2相同

*(*x+2)x[0][2]我們已經看到。 *(*x)將是x [0] [0],所以*(*x)+2x[0][0]+2。所以*(*x+2)*(*x)+2最終等於3,但這僅僅是一個巧合。