通过数组移动指针 - 通过引用或递增传递?

Moving a pointer through array - passing by reference or incrementation?

我完全不知道下面两个例子有什么区别:

void function(int *p) {

p++;

}

int main() {

int values[] = {1,2,3};
int *p = values;
function(p);

cout << *p;

return 0;
}

这个returns“1”.

而稍作修改会产生“2”(这是想要的结果):

int main() {

int values[] = {1,2,3};
int *p = values;
p++;

cout << *p;

return 0;
}

问题出在哪里?是引用传递还是递增?

这里的问题是

void function(int *p) {
    p++;
}

正在使用按值传递 - 不是按引用传递。由于指针是按值传递的,因此您对指针本身所做的任何更改都不会反映在调用站点中。如果你需要修改指针指向的位置,那么你需要通过引用传递它,比如

void function(int*& p) {
    p++;
}

现在,当您递增时,它将指向第二个元素,就像您在第二个示例中所做的那样。

在这个例子中

void function(int *p) {

p++;

}

int main() {

int values[] = {1,2,3};
int *p = values;
function(p);

cout << *p;

return 0;
}

您正在按值传递指针,这意味着您只需传递指针指向的地址的副本。然后继续增加该函数的该指针的本地副本,然后退出该函数。当您递增本地副本时,这对原始指针没有影响。

但是在这个例子中

int main() {

int values[] = {1,2,3};
int *p = values;
p++;

cout << *p;

return 0;
}

您直接递增指针,这意味着它现在指向数组中的下一个元素。

在第一种情况下,address 的值是按值传递的。

函数(p)==>无效函数(int *p){}

右边的'p'是局部变量。所以对指针的任何修改都只会在函数内部可见。