# I cant understand why i get such an output?

1. Oct 15, 2008

### transgalactic

i cant understand why i get such an output??

Code (Text):

int array[] = { 45, 67, 89 };    //1st ine
int *array_ptr = &array[1];   //2nd line
printf("%i\n", array_ptr[1]);   //3rd line

the second line links the pointer *array_ptr with the value of cell "1"
but in the third line it should have print the address of cell "1"
not its value 89

i think that if i want to print cell one we need to change this line into

Code (Text):

printf("%i\n",*array_ptr[1]);

why i get the value of cell "1"
when by my logic i should get the adress of cell "1"

??

2. Oct 15, 2008

### Rogerio

Re: i cant understand why i get such an output??

First of all, all arrays in C start at element ZERO.
So, the second line sets the "array_ptr" to the second cell's address of "array".
Then "array_ptr + 1" is the pointer to the third cell of "array".
And finally, array_ptr[1] is the content of the third cell of "array".
Of course, you could write it as "*(array_ptr + 1)" , too.

Last edited: Oct 15, 2008
3. Oct 15, 2008

### Rogerio

Re: i cant understand why i get such an output??

And the suggestion "*array_ptr[1]" it is not what you would like it was...

4. Oct 15, 2008

### KTC

Re: i cant understand why i get such an output??

Let's take it one line at a time.

Code (Text):
int array[] = { 45, 67, 89 };    //1st ine
An array of int of 3 elements, with indexes from 0 to 2. So we have array[0] = 45, array[1] = 67, and array[2] = 89.

Code (Text):
int *array_ptr = &array[1];   //2nd line
&array[1] is the same as &( array[1] ). So, we are assigning the address of array[1] to the pointer to int array_ptr. In other word, array_ptr now contain the address of the variable with the value 67.

Code (Text):
printf("%i\n", array_ptr[1]);   //3rd line
First thing to remember is that in C, array and pointer is (almost always) inter-changable in certain context. array_ptr is a pointer, but when used as an array will start "counting" from where it is pointing to at that time. So, since [1] mean the second element of an array, array_ptr[1] mean the 2nd element of the "array" array_ptr, i.e. one past what it's pointing to now. And since it's currently pointing to array[1], that will be array[2], which holds the value 89, which is what's printed.