我有一個數組爲:指針間接混亂
int x[3][5]={
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
- 是什麼* X是指什麼?
- *(* x + 2)+5參考「8」。這是怎麼發生的?
- 是*(* x + 2)與*(* x)+2相同嗎?
如果我這樣做:
* n =&x; 指針n指向哪裏?如果它只有x而不是&那麼它就是基地址。現在是什麼?
我有一個數組爲:指針間接混亂
int x[3][5]={
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
如果我這樣做:
* n =&x; 指針n指向哪裏?如果它只有x而不是&那麼它就是基地址。現在是什麼?
*x
是取消引用操作。換句話說,「給我什麼x
指向」。由於這是一個數組(數組),所以dereferencing x會給你第一個數組。這相當於x[0]
的數組訪問語法。
*(*x+2)+5
相當於x[0][2] + 5
,它給你8.這是因爲: *x
相同x[0]
(參見#1)和*(x + 2)
相同x[2]
。一旦你完成了兩個解引用,你已經從一個數組的數組(類似於一個雙指針)到一個數組(單指針)到一個實際的數字(第一個數組中的第三個條目)。然後,它只是3 + 5 = 8.
*(*x+2)
相當於x[0][2]
(參見#2),它是3(數組中的第三個元素)。然而,*(*x) + 2
給你x[0][0] + 2
(數組中的第一個元素加上2),這是1 + 2 = 3。同樣的答案,但獲得它的方式非常不同。
你是說如果我有*(* x + 1),我會先找到它指向的地方?即x [0] [0],然後加1到它指向的值?不會和*(* x)+1相同嗎? – 2010-09-02 15:30:07
@fahad *(* x + 1)將是x [0] [1],它是第一個數組中的第二個元素。 *(* x)+1表示取x [0] [0]並將1加1。再次,在你的具體情況下,它們都等於2。 – Bob 2010-09-02 15:40:54
*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
的值相同,但不使用數組中的相同元素。
'* x'不是一個指針,它是一個數組。在某些情況下,它可能衰減到指針,但並不總是如此。例如,嘗試'sizeof * x'。 – 2010-09-02 15:33:30
好點,我會改變措辭。 – WildCrustacean 2010-09-02 15:34:30
x是一個int**
所以它就像是如果你有第一層指針,並且他們每個人都指向一個int*
(所以一個int
的數組)。
當您編寫*x
時,您將獲得包含指向多維數組第一行的地址的地址。
所以,如果你參考(*x + 2)
,如果它像引用你的第一行數組,然後加2到地址:你獲得第一行的第三個元素的地址。但是由於這仍然是一個指針,所以您需要添加一個外部的*(*x+2)
來精確地獲取第一行的第三個元素。
'x'不是'int **'。 'x'永遠不會衰變爲'int **'。 – 2010-09-02 15:32:43
認爲它是這樣的:
typedef int Int5[5];
Int5 x[3];
x
是具有3個元素的數組。這三個元素中的每一個都是5個整數的數組。
x
相同「& X [0] so
* X is the same as
X [0]`是第一5個元素的數組。
*x
爲x [0],並且x+2
是&x[2]
所以*x+2
&x[0][2]
是和*(*x + 2)
是x[0][2]
這恰好是3.添加五到,對於8
*(*x+2)
是x[0][2]
我們已經看到。 *(*x)
將是x [0] [0],所以*(*x)+2
是x[0][0]+2
。所以*(*x+2)
和*(*x)+2
最終等於3,但這僅僅是一個巧合。
看起來很像功課。你可以請至少嘗試自己先回答嗎? – x4u 2010-09-02 15:11:04
我可以很容易地通過運行該程序來做到這一點。我需要一個親愛的解釋。 – 2010-09-02 15:13:26