как эти 2 указателя могут иметь одинаковое значение? - PullRequest
0 голосов
/ 28 января 2019

У меня проблема с этим кодом. Ответ 26 14 26 26.

Проблема в том, что я продолжаю находить x как 13. После того, как первая забавная функция x и xptr становится 13, но я не могу понятькак это становится 26.

#include <iostream>
using namespace std;
int* fun(int *a){
    *a = *a +5;
    return a;
}
int main(){
    int x, y, *xpntr, *ypntr;
    x = 3;
    xpntr = &x;
    fun(xpntr);
    y = 10 + (*xpntr / 2);
    ypntr = fun(xpntr);
    *ypntr = *xpntr + *ypntr;
    cout << x << " " << y << " " << *xpntr << " " << *ypntr << endl;
}

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Давайте шаг за шагом пройдемся по вашему коду

#include <iostream>
using namespace std;
int* fun(int *a){

Следующая строка означает: «получить значение из местоположения, на которое указывает указатель a, добавить 5 к нему и записать его вуказатель местоположения a указывает на ". Это не меняет сам указатель!

    *a = *a +5;

Далее возвращает указатель a, который является точно таким же значением, которое было передано функции

    return a;
}

int main(){
    int x, y, *xpntr, *ypntr;
    x = 3;

Назначьте xpntr ячейку памяти x

    xpntr = &x;

Вызовите fun с xpntr, откажитесь от того, что он вернет.x тогда будет 3 + 5 = 8

    fun(xpntr);

. Присвойте y результат 10 + ( значение того, на что xpntr указывает на / 2) - xpntr isnне изменилосьy = 10 + (8/2) = 14

    y = 10 + (*xpntr / 2);

Позвоните fun с xpntr, что-то происходит с тем, на что указывает xpntr, но, как мы уже узнали, сам xpntr не являетсяизменилось в процессе.Значение, возвращаемое fun (равное xpntr), присваивается ypntr.x будет снова изменен на 8 + 5 = 13

    ypntr = fun(xpntr);

Назначить, куда указывает ypntr (который сейчас идентичен xpntr сумме того, на что указывает xpntrи ypntr. Таким образом, x будет 13 + 13 = 26 ← отсюда ваши 26!

    *ypntr = *xpntr + *ypntr;

Выведите значения где xpntr и ypntr указать на.

    cout << x << " " << y << " " << *xpntr << " " << *ypntr << endl;
}
0 голосов
/ 28 января 2019

Перед вашей ypntr = fun(xpntr); строкой x=8 и xpntr указывают на x.

Теперь самое сложное: ypntr = fun(xpntr) меняет значение x на 13. И fun возвращает ссылку на x - ypntr теперь также указывает на x.

Это означает, что и xptr, и yptr будут указывать на одни и те же данные.

Ваше последнее утверждение (*ypntr = *xpntr + *ypntr) просто удваивает значение x.

+---------------------------+----+----+------+------+
|           code            | x  | y  | xptr | yptr |
+---------------------------+----+----+------+------+
| x = 3;                    |  3 | ?  | ?    | ?    |
| xpntr = &x;               |  3 | ?  | &x   | ?    |
| fun(xpntr);               |  8 | ?  | &x   | ?    |
| y = 10 + (*xpntr / 2);    |  8 | 14 | &x   | ?    |
| ypntr = fun(xpntr);       | 13 | 14 | &x   | &x   |
| *ypntr = *xpntr + *ypntr; | 26 | 14 | &x   | &x   |
+---------------------------+----+----+------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...