2015-10-14 75 views
1

我正在爲我的中期學習。這是對問題30和31 的示例代碼*(數組+3)如何工作?

#include <stdio.h> 
void doubleArray(int array[], int length) 
{ 
for (int i = 0; i < length-2; i++) { 
     array[i] += array[i]; 
} 
    length += 5; 
    printf(「%d\n」, length); // Question 29 
} 


int main(int argc,char *argv[]) { 
    int integers[6] = { 3, 4, 5, 6, 7, 8}; 
    int length = 6; 


printf(「%d\n」, integers[4]); // Question 28 
doubleArray(integers, length); 
printf(「%d\n」, *(integers + 3)); // Question 30 
printf(「%d\n」, *(integers + 4)); // Question 31 
printf(「%d\n」, length); // Question 32 
} 

的答案是,它打印12(30)和7(31) 可有人向我解釋爲什麼,什麼是「*(整數+ 3) 「是指?

+0

它意味着同樣的事情'整數[ 3]',定義如下: –

+0

printf(「%d \ n」,*(整數+ 3)),那麼它如何打印出12? –

+0

doubleArray() –

回答

2

*是指針上的解引用運算符。

這意味着它將「獲取」存儲在其後的項目的指針地址處的值((integers + 3))。

它將後(int因爲(integers + 3)int*類型的)解釋該值作爲解除引用的類型的項目的

(整數+ 3)

integers是指向的地址integers數組的第一個元素。

這意味着如果integers包含[1, 2, 3, 4, 5]那麼它會指向1存儲在內存中。

integers + 3需要的integers的地址(即,其中1被存儲在存儲器中),並增加了的地址空間來存儲3個int小號所需的量(因爲指針是int*類型)。將它推進一個空格會使內存中的地址爲2,將它前進兩個空格將使內存中的地址爲3,並且將其前進三個空格將使內存中的地址爲4

如何適用於您的例子

(integers + 3)爲您提供了4項的integers數組中的地址,因爲它是第一個元素的地址加上三個元素的大小。

提領,與*運營商,爲您提供了4元的價值,12(因爲6價值被doubleArray一倍)

這同樣適用於*(integers + 4)除了doubleArray 5日沒有翻番元素,所以它給你7

如何doubleArray工作

for (int i = 0; i < length-2; i++)手段從0開始的變量i和推進它,直到它是length - 2

這意味着它需要一切的值從0到的length - 2值,但執行循環從0值的身體length - 3由於<被獨佔(條件之前執行所述循環體,從而評價當i == length - 2條件爲false,循環終止,而不進一步執行。

所以,對於每個元件,但不包括最後兩個,在array的元素被添加到其自身。

+0

謝謝你太多了! –

+0

祝你中期好運! – arcyqwerty