递增指针时带或不带星号

With or without an asterisk when incrementing pointer

本文关键字:指针      更新时间:2023-10-16

>在 cplusplus.com 教程中的"void 指针"示例中,我尝试像下面这样进行比较。为什么我们还需要括号中的*?没有*时会发生什么?

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 ted 而不是 pchar ,这个cout仍然打印一个有点有意义的值(在这个例子中,它将是'x')。

*运算符取消引用指针。

因此,此代码:

++(*pint)

递增 pint 指向的值。

相比之下,此代码:

++(pint)

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

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

当您从指针到其他指针进行强制转换时

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

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

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