2011-12-26 65 views
1

我是C和C++的新手,我只使用Java語言中的數組和多維數組。 我試圖移植一些代碼,我需要知道這些行的意思是:這些代碼行是做什麼的?它涉及指針和數組

int rows = 100; 
int columns = 10; 
int i,j; 
double *example = new double[rows*columns]; 
File fileEx = fopen("exampleText.txt","r"); 
for(i=0;i<rows;i++) 
    for(j=0;j<columns;j++){ 
     fscanf(fileEx, "%lf", example+columns*i+j); 
     //printf("%f ", *(example+columns*i+j)); 
    } 

非常感謝...幫助感激!

+1

哪條線,具體來說,你不明白? – 2011-12-26 20:46:07

+6

如果我是你,我會在C上得到一本好書。 – 2011-12-26 20:46:50

回答

4

它正在讀取一個值爲double的二維數組,每次一個。

example + columns*i + j在每次迭代中產生一個指向數組的右元素的指針。

話雖如此,數組被分配爲一維數組,並且程序將在每次訪問數組元素時使用計算來執行下標。

代碼在使用前應檢查File(是否爲FILE的錯字?)已成功打開。在每次迭代中檢查fscanf()成功也不是一個壞主意。

+0

哦,我明白了!因爲這是我第一次看到指針,所以我認爲coloumns * i和rows *列是某種指針函數,而不是簡單的乘法。非常感謝!......出於某種原因,似乎我不能選擇這個作爲這臺計算機上的正確答案......當我回到家時,我會檢查這是否正確...再次感謝! – user947659 2011-12-26 21:00:38

1

這段代碼讀取一個二維數組,表示爲文件中的一維數組。

double *example = new double[rows*columns]; 

這行實際上爲你的數組分配內存空間。所以基本上,example將引用您在內存中的陣列的基地址。通過執行諸如example + 4之類的操作,可以訪問陣列的地址+ 32字節。實際上,總和適用於你的數組的類型:這裏每個單元8字節(雙倍大小),所以+4意味着4 * 8 = 32字節。

如果你有一個int(4字節)數組,那麼+4意味着你正在訪問的地址+16字節爲4 * 4字節= 16字節。

在最簡單的字,這樣做example + 4你正要第四單元陣列中,它會像書面方式example[3],因爲每個小區實際擁有雙(所以8個字節),並通過這樣做address + 32你跳過第一3個要素。

fscanf(fileEx, "%lf", example+columns*i+j); 

知道了,此行只是意味着你把當前字符在細胞columns * i + j,就像您在任何其他語言做。