Перемещение указателя через массив - передача по ссылке или приращению?
Я понятия не имею, в чем разница между двумя следующими примерами:
void function(int *p) {
p++;
}
int main() {
int values[] = {1,2,3};
int *p = values;
function(p);
cout << *p;
return 0;
}
Этот возвращает "1".
В то время как небольшая модификация дает "2" (что является желаемым результатом):
int main() {
int values[] = {1,2,3};
int *p = values;
p++;
cout << *p;
return 0;
}
В чем проблема? Это происходит из-за передачи по ссылке или увеличения?
3 ответа
В этом примере
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;
}
Вы напрямую увеличиваете свой указатель, что означает, что он теперь указывает на следующий элемент в массиве.
Проблема здесь
void function(int *p) {
p++;
}
Используется передача по значению, а не передача по ссылке. Поскольку указатель передается по значению, любое изменение, которое вы вносите в сам указатель, не отражается на сайте вызова. Если вам нужно изменить, где указатель указывает, то вам нужно передать его по ссылке, как
void function(int*& p) {
p++;
}
Теперь, когда вы увеличиваете, он будет указывать на второй элемент, как во втором примере.
В первом случае значение адреса передается по значению.
function (p) ==> void function (int * p) {}
'P' на правой стороне локальная переменная. Таким образом, любая модификация указателя будет видна только внутри функции.