我完全不知道,以下两个例子之间的区别是什么:
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;
}
问题在哪里?它是由于通过引用传递还是递增?
答案 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;右侧是一个局部变量。因此,只有在函数内部才能看到对指针的任何修改。