2009-10-17 129 views
2
while(i < a_rows * a_cols) { 
    out[i] = *(a_mat + i); // this line 
    i++; 
} 

標記行是做什麼的?out [i] = *(a_mat + i)在C中做什麼?

+1

這是爲什麼關閉?在這個世界上怎麼可能「標誌線做什麼?」不是一個真正的問題?我在這裏錯過了什麼嗎? – sbi 2009-10-18 12:25:43

+1

我同意@sbi。 「初級問題」!=「不是真正的問題。」 – 2009-10-21 02:00:14

回答

12

它得到a_mat + i指向的值。它本來可以寫成a_mat[i]

+0

好吧,只要a_mat被聲明爲一個數組,並且它所擁有的都有一個1字節的「sizeof」。 – 2009-10-17 07:00:43

+10

不,'a_mat [i]'和'*(a_mat + i)'在所有情況下都是等價的,因爲這是如何定義索引操作符的。 – JaakkoK 2009-10-17 07:12:48

+4

@Mthethe Scharley將1添加到int *類型的指針將增加4個字節的指針,而不是一個。所以*(a_mat + i)完全等同於a_mat [i]。 – Ben 2009-10-17 07:13:38

3

在C中,x[i]*(x + i)的表達式相同,因爲向指針添加整數是通過將整數縮放爲指向對象的大小來完成的,因爲它是按照這種方式定義的。

這意味着儘管它的外觀不對稱,C中的索引運算符[]是可交換的。

這種傳統的演示是一樣的東西:

main() { 
    int x[] = { 1, 2, 3, 4 }; 

     printf("%d\n", x[2]); 
     printf("%d\n", 2[x]); 
} 

這兩條線是等價的,打印同樣的事情。

+0

+1來提及'x [2] == 2 [x]' - 這是我最喜歡的C語言部分,因爲它起初看起來不直觀,但是在你理解了它的理由之後,它具有非常數學的對稱性。 – 2009-10-21 01:58:55

相關問題