c++ - 递增指针时带或不带星号

标签 c++ pointers void-pointers

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 的地址递增以指向无意义的位置。但是因为 main 中的变量 acout 而不是 pchar,所以这个 cout仍然打印出一个有点有意义的值(在本例中为“x”)。

最佳答案

* 运算符取消引用指针。

因此,这段代码:

++(*pint)

增加 pint 指向的值。

相比之下,这段代码:

++(pint)

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

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

关于c++ - 递增指针时带或不带星号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10592338/

相关文章:

c++ - 将图像顺时针旋转 90 度

c++ - auto_ptr 到普通指针的转换

c - C 的 void* 除了让代码更地道之外还有其他用途吗?

c++ - 右值引用或转发引用?

c++ - 将 float 的最接近的整数次幂向下舍入

c++ - 删除 IE9 缓存和 Cookie

c++ - 我们可以在C++中向数组添加整数吗

C++ 指针帮助缺少参数列表用户帐户::getBalance

c++ - 使用指针交换两个变量

c - 空指针、类型转换和可能的代码改进