Перемещение указателя через массив - передача по ссылке или приращению?

Я понятия не имею, в чем разница между двумя следующими примерами:

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' на правой стороне локальная переменная. Таким образом, любая модификация указателя будет видна только внутри функции.

Другие вопросы по тегам