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

时间:2016-08-05 12:38:25

标签: c++ arrays pointers pass-by-reference increment

我完全不知道,以下两个例子之间的区别是什么:

void function(int *p) {

p++;

}

int main() {

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

cout << *p;

return 0;
}

这个返回&#34; 1&#34;。

虽然略有修改,但&#34; 2&#34; (这是想要的结果):

int main() {

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

cout << *p;

return 0;
}

问题在哪里?它是由于通过引用传递还是递增?

3 个答案:

答案 0 :(得分:4)

这里的问题是

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

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

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

现在当你增加它时会指向第二个元素,就像你在第二个例子中那样。

答案 1 :(得分:2)

在这个例子中

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;
}

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

答案 2 :(得分:0)

在第一种情况下,地址的值按值传递。

功能(p)==&gt; void function(int * p){}

&#39; p&#39;右侧是一个局部变量。因此,只有在函数内部才能看到对指针的任何修改。