0

cplusplus.com教程中的“空指针”示例中,我尝试进行如下比较。为什么我们还需要*括号?没有时会发生什么*

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 Gray的回答,我试图弄清楚我没有得到什么。的地址pchar递增以指向无意义的位置。但是因为变量ainmaincoutted 而不是pchar,这cout仍然会打印出一个有意义的值(在本例中为“x”)。

4

2 回答 2

4

*运算符取消引用指针。

因此,这段代码:

++(*pint)

递增指向 pint的值。

相比之下,这段代码:

++(pint)

增加指针本身pint. 这就是为什么指针指向的值不会改变的原因。您不会更改指针指向的值,而是更改指针本身的值。

递增指针将导致它指向内存中完全不同的值。在这种情况下,由于您只为单个整数分配空间,它将指向一个无意义的值。

于 2012-05-14T23:31:01.963 回答
1

当您从指针转换到其他指针时

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

您告诉编译器将此内存作为 char 指针处理,您可以在其中对该变量执行指针运算。因此,您不是仅使用指针来处理指针的值,而是在其中进行算术运算的内存地址。

要使用该值,您需要使用“*”或通过字符访问内存指针。

于 2012-05-14T23:35:05.573 回答