AlexBrand
AlexBrand

Reputation: 12409

Learning C - Pointers and memory addressing

I am learning C programming and I have a simple question about pointers...

I used the following code to play around with pointers:

#include <stdio.h>

int main (int argc, const char * argv[]) {

int * c;

printf("%x\n",c);
return 0;
}

When I print the value of C, I get back a 0. However, when I print &c (i.e. printf("&x\n",&c) I get an address in memory...

Shouldn't I be getting an address in memory when printing the pointer (i.e. printf("%x\n",c)?

--- EDIT ---

#include <stdio.h>
#include <stdlib.h>

int main (int argc, const char * argv[]) {

    char * a = malloc(11);
    printf("String please\n");
    scanf("%s",a);
    printf("%s",a);

}

The question is, why does printf("%s",a) returns the string instead of the address that is stored in a?

Shouldn't I use *a to follow the pointer and then print the string?

Upvotes: 2

Views: 1087

Answers (4)

user25581
user25581

Reputation:

printf is actually quite a complex function and can be made to do all sorts of tricks by giving it the right format specifier.

In your string example:

printf("%s", a)

the "%s" tells the printf function that the following variable should be treated as a string. In C, a string is a pointer to one or more char, terminated by a char containing 0. This is a pretty common request, which is why printf supports a format specifier "%s" that triggers this relatively complex behavior. If you want to print the address contained in the string pointer you have to use the format you found earlier:

printf("%x\n",a);

which tells printf to treat the contents of a as an unsigned integer, and print it in base 16.

*a would just be the value pointed to by a, which is just a single character.

You could print the single character with

printf("%c", *a);

Upvotes: 1

Praveen S
Praveen S

Reputation: 10393

#include <stdio.h>

int main (int argc, const char * argv[]) {

int * c;
int a=10;
c = &a;

printf("%x\n",c);
return 0;
}

This may clarify what happens when you make the int pointer point to something in memory.

Upvotes: 0

Jari
Jari

Reputation: 2152

Having int* c; If you print value of c, you get back a value that should be interpreted as a memory address of an integer value. In you example it might be 0 or something completely different as you are not initializing c.

If you print &c you get memory address of the pointer c (stored in stack).

Upvotes: 0

Andrey
Andrey

Reputation: 60065

your current program is not correct. You define variable and do not set value before first use. the initial value is not guranteed for c, but you are lucky and it is equal to 0. It means that c points to nowhere. when you print &c you print address of variable c itself. So actually both versions print address.

Upvotes: 11

Related Questions