I'm trying something very simple, well supposed to be simple but it somehow is messing with me...
I am trying to understand the effect of ++ on arrays when treated as pointers and pointers when treated as arrays.
So,
int main()
{
int a[4] = { 1, 4, 7, 9 };
*a = 3;
*(a+1) = 4;
*++a = 4; //compiler error
}
1: So at *(a+1)=4
we set a[1]=4; //Happy
But when *++a = 4;
, I'd expect pointer a to be incremented one since ++ is precedent to * and then * kicks in and we make it equal to 4. But this code just does not work... Why is that?
Another problem:
int main()
{
int* p = (int *)malloc(8);
*p = 5;
printf("%d", p[0]);
*++p = 9; //now this works!
printf("%d", p[1]); //garbage
printf("%d", p[0]); //prints 9
}
2: Now *++p = 9; works fine but it's not really behaving like an array. How are two different? This is just incrementing p, and making it equal to 9. If I print p[0], it now prints 9 and I see that though can't access it via p[0] anymore, *(p-1) shows 5 is still there. So indexing a pointer with [0], where exactly does it point to? What has changed?
Thanks a lot all experts!
There is one difference between an array name and a pointer that must be kept in mind. A pointer is a variable, so
pa=a
andpa++
are legal. But an array name is not a variable; constructions likea=pa
anda++
are illegalDon't cast result of malloc()
Use index with pointer
The array names is not modifiable lvalue so operation ++ is not applied hence
++a
that try to modifya
is compilation time error (wherea
is array name).Note
*(a + 1)
and*a++
are not same,a + 1
is a valid instruction as it just add1
but doesn't modifya
itself, Whereas++a
(that is equvilent toa = a + 1
) try to modify a hence error.Note 'array names' are not pointer. Pointers are variable but array names are not. Of-course when you assign array name to a pointer then in most expressions array names decays into address of first element. e.g.
Note
p
points to first element of array (a[0]
).Read some exceptions where array name not decaying into a pointer to first element?
An expression
a[i]
is equivalent to*(a + i)
, wherea
can be either a pointer or an array name. Hence in your second examplep[i]
is valid expression.Additionally,
*++p
is valid because becausep
is a pointer (a variable) in second code example.