views:

116

answers:

7

I'm trying to learn about C pointers but I cannot understand somethings... The following code:

#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;
}

Why are the addresses different? The first printf (main) output two addresses. the other printf (foo) output diferent addresses. I'm passing addresses to foo (& operator).

Thank you

+3  A: 

because printf("x = %p\ny = %p\n", &x, &y); print the address of x and y, instead of their value. You need to replace it with

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

to yield same results.

tia
+1 for beating me to it :)
iniju
+3  A: 

Your foo function takes pointers to int as parameters, that means that x and y are already pointers in foo and their values are the addresses you want to print.

Instead you print the addresses of these pointers. Your print should look more like

printf("x = %p\ny = %p\n", x, y);
iniju
+8  A: 

In main, you're printing addresses of x and y, but in foo, you're printing addresses of pointers to x and y. You meant to write:

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

(notice the lack of & before x and y)

Mark Rushakoff
+2  A: 

The printf call in foo is being passed the addresses of the pointers, i.e., variables of type int **. If you remove the & symbols from the printf call you should get the same addresses as from the printf call in main.

Philip Starhill
off course... sorry guys and thank you!
cnoob
A: 

The first printf in main() displays the addresses of main's a and b.

The foo's printf displays the addresses of x and y.

What you want, I guess, is to display the addresses from main() of a and b

Change foo:

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

to display the addresses as they come from main()

ring0
+1  A: 

In main, you are printing the adresses of the local variables a and b. In foo you are printing the addresses of the local variables x and y, not the addresses retained in them. You need to drop the & in foo if you want them to match.

Remember that a pointer is a variable that holds a memory address. You're confusing the address of the pointer variable with the address retained in the pointer. You need to print what the pointers hold if you want the two prints to match.

IVlad
A: 

First, about your C:

If you are defining the entire function above main(), you need not include its prototype before it. So delete the 2nd line:

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

Now, for the real matter at hand, a pseudo memory map would come handy:

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

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

So here, you shall get:

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

If you want:

x = 1000 y = 1004

Type,

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

as is clear from the memory map above.

Kedar Soparkar