Не должно быть на выходе 2 2 - PullRequest
0 голосов
/ 08 ноября 2019
    int i = 0, j = 1; 
    void func(int *p, int *q) 
    { 
        p = q; //Here the address of p and q are made same. 
      * p = 2; // value @ address pointed by 'p'(which is q) is now set to 2.
    }     
    int main() //Start of Main
    { 
        func(&i, &j); 
        printf("%d %d n", i, j); 
        return 0; 
    }
when address held in p and q are same , i'm not understanding why the output isn't same as well (2 2).
</code>
If i fire up gdb i see the following
(gdb) p &p 
$4 = (int **) 0x7fffffffebc8   <<Actual address of var p                                                                 (gdb) p &q                                                                               
$6 = (int **) 0x7fffffffebc0   << Actual address of var q                                                       (gdb) n                                                                                          17      }                                                                                    
(gdb) p p                                                                                    
$8 = (int *) 0x601040 <j>    << After the func ends its pointing only to 'j'                                                                
(gdb) p q                                                                                    
$9 = (int *) 0x601040 <j>

Это как-то связано со стеками, отличающимися между main() и func()?

Из того, что я знаю, адрес, на который указывает 'i', переопределяется 'j' isnне так ли?

Может кто-нибудь, пожалуйста, исправьте мое понимание?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

В C параметры передаются в виде копии. Таким образом, p и q являются копиями исходных адресов &i и &j, переданных в func(&i, &j);. Поэтому, когда вы делаете это:

p = q; //Here the address of p and q are made same. 

p и q теперь действительно одинаковы, оба адреса j. Поэтому, когда вы делаете это:

* p = 2; // value @ address pointed by 'p'(which is q) is now set to 2.

Он устанавливает то, на что p указывает (что j) на 2.

i не изменяется вообщеэто, так что все еще 0. Вы передали адрес i в качестве параметра p, но сразу же отбросили этот адрес, установив вместо p q.

0 голосов
/ 08 ноября 2019

Первоначально в глобальной области видимости значения i и j равны 0 и 1 соответственно. При вызове функции адрес (местоположение) i и j пройден.

Here, 
*p = i,
*q = j;

В функции callee p и q содержат адреса i и j. При назначении p = q. q назначено p, что означает, что p также содержит адрес j . И затем, *p = 2 установите значение для адреса, указанного p. В настоящее время p указывает на j.So, в то время как значение j печати равно 2, а значения i остаются неизменными. В этом сценарии у нас нет указателя на i. Мы изменяем значение i только через i.

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...