2012-05-14 31 views
0

cplusplus.com教程中的「void pointers」示例中,我嘗試比較如下。爲什麼我們仍然需要*括號?發生什麼事時沒有*?接受的解決方案後增加指針時有或沒有星號

void increase(void* data, int psize) { 
    if (psize == sizeof(char)) { 
     char* pchar; 
     pchar = (char*) data; 
     cout << "pchar=" << pchar << endl; 
     cout << "*pchar=" << *pchar << endl; 
     //++(*pchar); // increases the value pointed to, as expected 
     ++(pchar);  // the value pointed to doesn't change 
    } else if (psize == sizeof(int)) { 
     int* pint; 
     pint = (int*) data; 
     //++(*pint); // increases the value pointed to, as expected 
     ++(pint);  // the value pointed to doesn't change 
    } 
} 

int main() { 
    char a = 'x'; 
    int b = 1602; 
    increase(&a, sizeof(a)); 
    increase(&b, sizeof(b)); 
    cout << a << ", " << b << endl; 
    return 0; 
} 

更新)我試圖來明確一下,我沒有得到,基於@Cody灰色的答案。 pchar的地址遞增,指向無意義的位置。但是因爲main中的變量acout而不是pchar,所以此cout仍然會打印一個有點合理的值(在本例中爲'x')。

回答

4

*運營商解除引用的指針。

因此,該代碼:

++(*pint) 

遞增值通過pint指向。

相比之下,這段代碼:

++(pint) 

遞增指針本身pint。這就是爲什麼指針指向的值不會改變的原因。你不會改變指針指向的值,而是指針本身的值。

遞增指針會導致它指向內存中完全不同的值。在這種情況下,由於您只爲一個整數分配空間,它將指向一個無意義的值。

1

當您從指針到其他指針

char* pchar; 
pchar = (char*) data; 

你告訴編譯器來處理該內存爲char指針,在其中您可以執行指針運算來此變量的演員。因此,您不是僅僅使用指針來處理指針的值,而是您正在進行算術的存儲器地址。

要處理您需要使用「*」的值或由char訪問內存指針。