【问题标题】:With or without an asterisk when incrementing pointer递增指针时带或不带星号
【发布时间】:2012-05-14 23:28:08
【问题描述】:

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 中的变量acoutted 而不是pchar,所以这个cout 仍然会打印出一个有意义的值(在这个例子中它是'x')。

【问题讨论】:

    标签: c++ pointers void-pointers


    【解决方案1】:

    * 运算符取消引用指针。

    因此,这段代码:

    ++(*pint)
    

    增加pint所指向的值

    相比之下,这段代码:

    ++(pint)
    

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

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

    【讨论】:

      【解决方案2】:

      当你从一个指针转换到另一个指针时

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-08-06
        • 2019-11-30
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 2017-12-21
        • 1970-01-01
        • 2013-06-12
        • 1970-01-01
        相关资源
        最近更新 更多