We have
int a[5]={10, 20, 30, 40, 50};
I would like to know how does the following two code segment do?
int *ptr = (int *)(&a+1);
int *t = (int *)(&a -1);
If we have
printf("%d %d %d \n", *(a+1), *(ptr-1), *(t+1));
What should be the result?
Array in C is used to store elements of same types whereas Pointers are address varibles which stores the address of a variable. Now array variable is also having a address which can be pointed by a pointer and array can be navigated using pointer.
First of all, pointers are complicated. Precisely describing their semantics in a way that is consistent with common alias analyses requires adding a notion of “provenance”. In a language such as Java or ML where pointers are opaque types whose representation cannot be observed, this is actually fairly easy to do.
Difference Between Arrays and Pointers in C/C++ The pointer can be used to access the array elements, accessing the whole array using pointer arithmetic, makes the accessing faster. The main difference between Array and Pointers is the fixed size of the memory block.
An array is a collection of elements of similar data type whereas the pointer is a variable that stores the address of another variable. An array size decides the number of variables it can store whereas; a pointer variable can store the address of only one variable in it.
Since the type of a
is array-of-5-int
s, that means that the type of &a
is pointer-to-array-of-5-int
s.
When you add or subtract 1 from a pointer, you ask it to point to the next or previous object of that type in memory. So &a+1
is creating a pointer to the array-of-5-int
immediately after a
in memory (which doesn't exist), and &a-1
is creating a pointer to the array-of-5-int
immediately before a
in memory (which also doesn't exist). In memory, it looks like this (where each cell represents one int
):
Address: &a-1 &a &a+1
Contents: | ? | ? | ? | ? | ? | 10 | 20 | 30 | 40 | 50 | ? | ? | ? | ? | ? |
When a
is used in the expression *(a+1)
, it is converted to a pointer to its first element - so a pointer-to-int
pointing at the 10
value. Adding one to it then makes a pointer pointing at the next int
- a+1
points at the 20
value. *(a+1)
then fetches that value, so the first number printed is 20.
As ptr
is also a pointer-to-int
, that means that ptr - 1
creates a pointer to the int
immediately before ptr
- in this case, it'll be pointing at the 50. So the second number printed is 50.
Similarly, t + 1
creates a pointer to the int
immediately after t
- in this case, it's the second ?
in the above diagram. This is an uninitialised value - it could print anything at all, or even crash the program.
Address: &a-1 &a &a+1
t t+1 a a+1 ptr-1 ptr
Contents: | ? | ? | ? | ? | ? | 10 | 20 | 30 | 40 | 50 | ? | ? | ? | ? | ? |
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With