I am new to C programming and have been looking for this question for few days...
int arr[][2]={11,22,33,44,55,66};
int (*ptr)[2]=&arr[1]; //line a
int (*ptr1)[2]=arr[1]; //line b
For line (a) compiler has no issue but for line (b) it gives ERROR-cant convert int* to int[2]*
Now both &arr[1]
and arr[1]
have same size(when I checked in sizeof operator).
So please help me understand what exactly is happening? what is the difference between arr[1]
and &arr[1]
? Thank you!
Answer
"same size" does not mean "same type". There are various types with the same size.
arr[1]
has type int[2]
. So &arr[1]
has type int(*)[2]
, so line a
is fine.
When you use an expression with array type and it is not the operand of &
or sizeof
, it undergoes lvalue-to-rvalue conversion, and the result of this conversion is a pointer to the first element of the array. (This is sometimes called decay).
So on line b
, after decay, arr[1]
is the same as &arr[1][0]
which as type int *
. This is incompatible with int (*)[2]
so that assignment fails.
The definition of compatible type for pointers is (paraphrased) that the type is identical. Any assignment between non-compatible pointers other than void *
requires a cast (and probably doesn't do what you expect).
For further reading check the C FAQ and perhaps also search this site for highly-rated questions on the topic.
No comments:
Post a Comment