Двойные указатели - объяснение вывода - PullRequest
2 голосов
/ 31 октября 2019
#include <stdio.h>
int main(void){

    int a=1,b=2,c=3; int *p,*q,**r; p=&a;
    r=&q;
    q=&c;
    a=*q+**r;
    printf("x=%d y=%d z=%d\n",**r,*p,*q); 
    *r=p;
    a=*q+**r;
    printf("w=%d\n",a);
    return 0;
}

Вывод:

x=3 y=6 z=3
w=12

Мне удалось правильно предсказать вывод, но я не уверен, что у меня есть правильное объяснение для вывода z.

Пожалуйстапосмотрите, правильно ли я понимаю:

  • Прямо перед выполнением *r=p;, мы имеем a=6,b=2,c=3.
  • Когда выполняется *r=p;, значение в месте, к которому r указывает на значение изменено на p.
  • Теперь r указывает на q с адресом c, поэтому теперь q имеет адрес a, поскольку p точекдо a. Так что q теперь указывает на a. Так что *q дает 6.
  • Поскольку r все еще указывает на q, а q указывает на a, **r дает 6.
  • Так *q + **r = 6+6=12

Это правильное объяснение?

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Давайте разберемся:

  1. int a=1,b=2,c=3;

    a = 1
    b = 2
    c = 3
    
  2. int *p,*q,**r;

    p --> ?
    q --> ?
    r --> ? --> ?
    
  3. p=&a;

    p --> a = 1
    q --> ?
    r --> ? --> ?
    
  4. r=&q;

    p --> a = 1
    q --> ?
    r --> q --> ?
    
  5. q=&c;

    p --> a = 1
    q --> c = 3
    r --> q --> c = 3
    
  6. a=*q+**r;, как видно из предыдущего пункта, у нас есть:

    a = 3 + 3 = 6
    
  7. printf("x=%d y=%d z=%d\n",**r,*p,*q); отпечатков:

    x=3 y=6 z=3
    
  8. *r=p;. Это подлый: начиная с *r == q, меняется q. Это то же самое, что и q=p. Таким образом, мы получаем:

    p --> a = 6
    q --> a = 6
    r --> q --> a = 6
    
  9. a=*q+**r;, как видно из предыдущего пункта, мы имеем:

    a = 6 + 6 = 12
    
  10. printf("w=%d\n",a); отпечатков:

    w=12
    

Вывод: Ваше объяснение верно .

0 голосов
/ 31 октября 2019

Да. * r = p заставит элемент r указывать на, q указывать на тот же адрес, что и p, то есть & a. ** r совпадает с * q, которое является значением в & a, равным 6.

...