Упражнение по логике указателя в C - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь понять указатели и различные декларации.Мне предоставили пример с логикой указателя, но я не могу понять, как он работает точно.

Я дал следующий фрагмент:

int i, j, *p, *q;
i = 10;
p = &j;
q = malloc(sizeof(int));
*q = i;
j = i;
q = p;
*q = 5;
printf("%d %d %d %d", i, j, *p, *q);

В нем говорится, что результат равен 10 5 55 но я не могу понять почему.

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 02 мая 2019

Рисование - лучший способ выяснить, как манипулировать указателем.
(Хотя на бумаге это гораздо быстрее.)

  i              j
+----+        +----+
| 10 |        |    |
+----+        +----+

[p = &j; p is the location of j]
  i              j
+----+        +----+
| 10 |        |    |
+----+        +----+
                 ^
                 |
                 p

[q = malloc(sizeof(int)); q is the location of an unnamed int]
  i              j
+----+        +----+        +----+
| 10 |        |    |        |    |
+----+        +----+        +----+
                 ^             ^
                 |             |
                 p             q

[*q = i; replace the value of the int that q points to with i's value]
  i              j
+----+        +----+        +----+
| 10 |        |    |        | 10 |
+----+        +----+        +----+
                 ^             ^
                 |             |
                 p             q

[j = i; replace the value of j with the value of i]
  i              j
+----+        +----+        +----+
| 10 |        | 10 |        | 10 |
+----+        +----+        +----+
                 ^             ^
                 |             |
                 p             q

[q = p; replace the value of q with the value of p, i.e. they are both &j]
  i              j
+----+        +----+        +----+
| 10 |        | 10 |        | 10 |
+----+        +----+        +----+
               ^  ^
               |  |
               p  q

[*q = 5; replace the value of the int that q points to with 5]
  i              j
+----+        +----+        +----+
| 10 |        | 5  |        | 10 |
+----+        +----+        +----+
               ^  ^
               |  |
               p  q
1 голос
/ 02 мая 2019

Ниже приведено пошаговое объяснение того, что делает код и как изменяется значение переменных. Я рекомендую вам использовать отладчик и пошагово код и проверять каждую переменную после каждого шага.

Но вот оно:

// Define two int variables (i and j) and two int-pointer variables (p and q)
int i, j, *p, *q; // i: uninitialized j: uninitialized p: uninitialized q: uninitialized 

// Assign 10 to i
i = 10; // i: 10, j: uninitialized, p: uninitialized, q: uninitialized

// Make p point to j
p = &j; // i: 10, j: uninitialized, p: points to j, q: uninitialized

// Allocate some memory for q
q = malloc(sizeof(int)); // i: 10, j: uninitialized, p: points to j, q: points to uninitialed memory

// Assign i to the memory that q points to
*q = i; // i: 10, j: uninitialized, p: points to j, q: points to memory containing 10

// Assign i to j
j = i; // i: 10, j: 10, p: points to j, q: points to memory containing 10

// Make q point to the same as p
q = p; // i: 10, j: 10, p: points to j, q: points to j

// Assign 5 to the memory that q points to (which is j)
*q = 5; // i: 10, j: 5, p: points to j, q: points to j

// print i (10), j (5), the memory p points to (j aka 5), the memory q points to (j aka 5)
printf("%d %d %d %d", i, j, *p, *q); // Print 10 5 5 5

Примечание:

q = p;

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

1 голос
/ 02 мая 2019

Обратите внимание на три утверждения:

  • p = &j;
  • q = p;
  • *q = 5;

Итак, *q, что совпадает с *p, который указывает на j, установлено в значение 5.

Итак, все три выражения j, *p, *q дают одно и то же значение.

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