递增指针时有或没有星号

时间:2012-05-14 23:28:08

标签: c++ pointers void-pointers

In" void指针"在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的地址递增以指向无意义的位置。但是因为a中的变量maincout而不是pchar,所以此cout仍会打印一个有意义的值(在此示例中它将是&#39; X&#39;。)

2 个答案:

答案 0 :(得分:4)

*运算符取消引用指针。

因此,这段代码:

++(*pint)

增加 pint指向的值

相比之下,这段代码:

++(pint)

递增指针本身pint。这就是指针指向的值不会改变的原因。您不是要更改指针指向的值,而是更改指针本身的值。

增加指针将使其指向内存中完全不同的值。在这种情况下,由于您只为一个整数分配了空格,因此它将指向一个无意义的值。

答案 1 :(得分:1)

当您从指针转换为其他指针

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

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

使用您需要使用“*”的值或通过char访问内存指针。