2012-04-15 115 views
0

有人可以根據這些無處不在的不一致設置路徑,因爲它可以讓人有點頭腦清醒。指針指針,指向地址值和2D數組訪問的清晰度

例如,如果我有一個2D數組,如rec[3][2],以下訪問意味着相同;

rec[0][0] = **rec 
rec[i][0] = **(rec + i) 
*(*(rec + i) + j) = rec[i][j] 

如果是這種情況,那麼什麼是這些含義:

#include <stdio.h> 
double *recptr[3]; 
int i=1; 

main() 
{ 
double n1=12.0; 
doublw n2=3.4; 

recptr[0]= &n1; 
recptr[1]= &n2; 

printf("Amt: %.2f\n", **(recptr + i)); 
} 

什麼是**(recptr + i),這是獲得2D指針或ponter到指針引用?

foo(ptr2ptr)double **ptr2ptr; 
{ 
int i=1, j=0; 
if(**(ptr2ptr +i) > **(ptr2ptr + j)) 
{ 
    double *tmp= *(recptr +i); 
} 
} 

又是什麼*(recptr +i)**(ptr2ptr +i)區別?!是以後也2D訪問或訪問指針2 - ponter引用和對象指向?

+0

可能重複[是數組名在C指針?](http://stackoverflow.com/問題/ 1641957 /是陣列名-A-指針在-c)的 – 2012-04-15 16:39:28

回答

1
double *recptr[3]; 

這將創建一個3個指針的數組,以加倍(double*)
現在,在main(),我們有雙重n1 = 12.0f和雙重n2 = 3.4f

現在我們將n1 (&n1)的地址分配給recptr[0](數組的第一個元素恰好指向雙打,所以現在它指向一個double(我們的n1)的地址)。注意這不是一個參考(理論上)。我們正在採用n1的地址。

我們用n2做同樣的事情,所以現在recptr[1]是一個指向n2地址的指針。

現在我們打印**(recptr + i) - >這意味着:

我們採取的陣列(recptr計算結果爲阿雷的地址)的第一個元素的地址,我們通過我彌補這個地址(這只是恰好是1)。現在請注意,我們不會再移動1個字節,我們進一步移動sizeof(double*)個字節。

現在,我們將這個位置*(recptr + i)解除引用,它是(第一個元素的地址+ sizeof(double*)字節),我們看到了什麼?那麼,它是一個指向double的指針(換句話說,它只是一個n2的地址)。因此,我們需要再次解除引用以實際看到此特定指針指向的值,因此**(recptr + i)

因此,第一個解除引用只是給了我們recptr數組的正確「單元」,但在那個單元中有一個指向double的指針,所以爲了獲得它的值,我們需要再次解除引用。

(我們便真的打印3.40,因爲它的地址恰好住在recptr陣列的第二單元)的