2013-04-21 33 views
0

我有一個關於指針的問題。我開始理解這個概念,但是這段代碼威脅到了這種理解,我只是想澄清它。C中的指針 - 添加1

請注意行「B」,這是printf("ptr + %d = %d\n",i, *ptr++); /*<--- B*/

我認爲,由於*ptr被初始化爲&my_array[0]的印象,然後*ptr++(這將轉化爲「無論是存儲在ptr地址,添加一個「)將打印出23,這是my_array[1]的值。

然而,它打印出的值爲my_array[0],即1

我很困惑++是否增加到地址本身(例如,1004變爲1005),並且由於整數佔用了大約4個字節的空間,所以它將落入my_array[0]的範圍內(因爲該值1,將佔用地址1001,1002,1003,1004,自my_array[0]在1001開始了,只上升到1002,然後*ptr++仍然會打印出my_array[0],這是1)...

或。 ..

是否*ptr++my_array[0](這只是*ptr)改爲my_array[1]*ptr++,這正是我原先的想法。

基本上,請詳細說明*ptr++對此程序的作用。請給我解釋一下,好像我五歲。

我真的很感激它,下面的代碼:

#include <stdio.h> 

int my_array[] = { 1, 23, 17, 4, -5, 100 }; 
int *ptr; 

int main(void) 
{ 
    int i; 
    ptr = &my_array[0];  /* point our pointer to the first 
            element of the array */ 
    printf("\n\n"); 
    for (i = 0; i < 6; i++) 
    { 
     printf("my_array[%d] = %d ", i, my_array[i]); /*<-- A */ 
     printf("ptr + %d = %d\n", i, *ptr++); /*<--- B*/ 
    } 
    return 0; 
} 

回答

3

更改此: printf("ptr + %d = %d\n",i, *ptr++); /*<--- B*/

這樣: printf("ptr + %d = %d\n",i, *(++ptr)); /*<--- B*/

當您使用後綴版本,如果遞增運算符,對象的增量前值由返回的表達。前綴遞增運算符(此答案中的第二組代碼使用)將通過引用返回遞增的對象。

+0

+1正確描述了postfix的實際工作方式。令人驚訝的是,有多少人認爲增量是在*聲明之後發生的,而不是你如何描述它,返回先前的價值。這是使用C++等語言實現代價最高的原因之一,因爲必須創建狀態的臨時副本。 – WhozCraig 2013-04-21 23:54:19

+0

因此,在printf之後* ptr ++遞增,而在printf之前遞增*(++ ptr)會打印出修改後的值。 – user2044189 2013-04-22 00:05:45

+0

而* ++ ptr與*(++ ptr)相同。謝謝! – user2044189 2013-04-22 00:07:17

0

* PTR ++會中的printf後增加。你應該使用*(++ p)。