C указатели - другой адрес - PullRequest
       4

C указатели - другой адрес

0 голосов
/ 28 сентября 2010

Я пытаюсь узнать о C-указателях, но кое-что не могу понять ... Следующий код:

#include <stdio.h>

void foo(int *x, int *y);

void foo(int *x, int *y) {
    printf("x = %p\ny = %p\n", &x, &y);
    *x = 5;
    *y = 6;
}

int main(void) {
    int a, b;
    printf("a = %p\nb = %p\n", &a, &b);
    foo(&a, &b);
    return 0;
}

Почему адреса разные? На первый printf (основной) выводятся два адреса. другой printf (foo) выводит разные адреса. Я передаю адреса в foo (& operator).

Ответы [ 8 ]

8 голосов
/ 28 сентября 2010

В main вы печатаете адреса x и y, но в foo вы печатаете адреса от указателей до x и y. Вы хотели написать:

printf("x = %p\ny = %p\n", x, y);

(обратите внимание на отсутствие & до x и y)

3 голосов
/ 28 сентября 2010

В вызов printf в foo передаются адреса указателей, т. Е. Переменные типа int **.Если вы удалите символы & из вызова printf, вы должны получить те же адреса, что и из вызова printf в main.

3 голосов
/ 28 сентября 2010

Ваша функция foo принимает указатели на int в качестве параметров, это означает, что x и y уже являются указателями на foo, а их значения - это адреса, которые вы хотите напечатать.

Вместо этого вы печатаете адреса этих указателей.Ваш отпечаток должен выглядеть как

printf("x = %p\ny = %p\n", x, y);
3 голосов
/ 28 сентября 2010

потому что printf("x = %p\ny = %p\n", &x, &y); выводит адрес x и y вместо их значения. Вам нужно заменить его на

printf("x = %p\ny = %p\n", x, y);

для получения одинаковых результатов.

2 голосов
/ 28 сентября 2010

Во-первых, о вашем C:

Если вы определяете всю функцию над main (), вам не нужно включать ее прототип перед ней.Итак, удалите 2-ю строку:

void foo(int *x, int *y);

Теперь, для реальной ситуации, подойдет карта псевдопамяти:

    a      b
 --------------
|  5   |   6   | <- data
 --------------
 [1000]  [1004]  <- address

    x        y
 ----------------
|  1000  | 1004  | <- data
 ----------------
  [2000]   [2004]  <- address

Итак,вы получите:

a = 1000 b = 1004  (the addresses of a & b)
x = 2000 y = 2004  (the addresses of x & y)

Если вы хотите:

x = 1000 y = 1004

Тип,

printf("x = %p\ny = %p\n", x, y);

, как это видно из карты памяти выше.

1 голос
/ 13 августа 2015

В основном вы печатаете адреса переменных a & b .. но в функции foo () вы печатаете адреса указателей на x & y

1 голос
/ 28 сентября 2010

В основном вы печатаете адреса локальных переменных a и bfoo вы печатаете адреса локальных переменных x и y, а не адреса, сохраненные в них.Вам нужно удалить & в foo, если вы хотите, чтобы они совпадали.

Помните, что указатель - это переменная, которая содержит адрес памяти.Вы путаете адрес переменной указателя с адресом, сохраненным в указателе.Вам нужно распечатать то, что держат указатели, если вы хотите, чтобы два отпечатка совпали.

0 голосов
/ 28 сентября 2010

Первый printf в main () отображает адреса основных a и b.

foo's printf отображает адреса x и y.

Полагаю, вы хотите отобразить адреса из main () из a и b

Изменить Foo:

  printf("x = %p\ny = %p\n", x, y);

для отображения адресов, как они приходят из main ()

...