Akhilesh
Akhilesh

Reputation: 53

Pointer not printing in the desired way

This is a C code

int (*a)[3];                                                        

a is a pointer to an array of 3 integers

a=(int (*)[3])malloc(sizeof(int)*3);                                

note the Typecast used here; the number of elements must be specified in the typecast shown. Also, the brackets around the * is necessary.

printf("brrbrrbrr  %d  %d  %d %d\n",&a,a,a+1,a+2);

*(a+0)[0]=40;
*(a+0)[1]=41;
*(a+0)[2]=42;
printf("noobnoob  %d %d %d \n",a[0][0],*(a+0)[1],(*(*(a+0)+2)));

The output is:

brrbrrbrr  -7077000  29278656  29278668 29278680
noobnoob  40 41 0 

I am not getting why the last number is 0 instead of 42?

Upvotes: 1

Views: 59

Answers (2)

Marian
Marian

Reputation: 7472

Indexation has higher precedence than dereferencing a pointer. Your assignments don't do what you want. They are evaluated like:

*((a+0)[0])=40;
*((a+0)[1])=41;
*((a+0)[2])=42;

If you want to keep your syntax, you shall use parenthesis like:

(*(a+0))[0] = 40;
(*(a+0))[1] = 41;
(*(a+0))[2] = 42;

The same applies for printing the second element of the array. *(a+0)[1] shall be (*(a+0))[1].

Upvotes: 1

Gopi
Gopi

Reputation: 19864

What you are looking for is

int (*a)[3] = malloc(sizeof(int) *3);

(*a)[0] = 40;
(*a)[1] = 41;
(*a)[2] = 42;


printf("%d %d %d\n",(*a)[0],(*a)[1],(*a)[2]);

a is a pointer to an array of 3 int members. So allocate memory for the pointer and store values as shown above.

If you want the address of where the values are stored then you should do

printf("%p\n",(void*)(a)[0]);

Upvotes: 0

Related Questions