使用指针作为函数的数据

Mar*_*lic 1 c++ pointers

好吧,我们有一个函数调用incr,它只是将数字增加1,然后返回新值,但将指针作为参数:

int incr(int *arg) 
{ 
    *arg++; 
    return *arg;
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我们写下以下内容:

int main()
   {
    int i = 1, j = 0;
    cout <<  j << endl;
    int* p_i = &i;
    j = incr(p_i); // changes both i and j
    cout << i << ", " << j << endl; //should print 2, 2 
    return 0;
    }
Run Code Online (Sandbox Code Playgroud)

因为我们使用变量的指针作为参数i,如果函数*p_i内部发生了某些事情incr,那么更改对于i何时incr完成也是永久性的.也因为我们设置j=incr(i)并且我们不返回p_i自己,但是它的内容(现在是2的值)i),j现在应该是2.但由于某种原因,结果如下:

1, -858993460
Run Code Online (Sandbox Code Playgroud)

而我根本不明白为什么.也许我在这个洞指针/函数调用的东西中理解了一些错误.任何帮助都会被批评

Vit*_*meo 6

这是运营商优先问题.

operator++优先级高于operator*,因此您递增地址,然后取消引用它.

(*arg)++; 
Run Code Online (Sandbox Code Playgroud)

将解决您的问题.


hac*_*cks 6

*arg++;将被解析为*(arg++);因为运算符优先++于解除引用运算符*.它将递增指针arg,然后获取未初始化的递增指针的值.在这种情况下,您的程序可能会调用未定义的行为.
您需要将其更改为(*arg)++;.