2010-09-28 4 views
0

Я пытаюсь узнать про указатели C, но я не могу понять нечто ... Следующий код: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 (&).

ответ

3

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

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

, чтобы получить те же результаты.

+0

+1 за избиение меня к нему :) – iniju

3

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

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

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

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

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

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

3

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

+0

от курса ... извините, ребята, и спасибо! – cnoob

0

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

В printf foo указаны адреса x и y.

То, что вы хотите, я думаю, это для отображения адреса из основных() из a и b

Изменения обув:

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

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

1

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

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

2

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

При определении всей функции выше основной(), вам не нужно включать его прототип перед ним. Так удалить 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

В основном, вы печатаете адрес в & б variables..but в функции Foo(), вы печатаете адреса указателей на й & Y

Смежные вопросы