I understand that when we use sizeof
operator on an array name, it gives the total size of the array in bytes. For example
int main(int argc, const char * argv[]) {
int a[][5] = {
{1,2,3,4,5},
{10,20,30,40,50},
{100,200,300,400,500}
};
int n=sizeof(a);
printf("%d\n",n);
}
It gives 60
as output for 15 elements
of the array. But when I write
int n=sizeof(*a);
It gives 20
as the output that is the size of the first row while *a
is the base address of the 0th
element of the 0th
row, and its type is a pointer to an integer. And a
points to the first row itself. Why is this happening?
*a
is row 0 of a
, and that row is an array of five int
.
In most expressions, an array is automatically converted to a pointer to its first element. Thus, when you use *a
in a statement such as int *x = *a;
, *a
is converted to a pointer to its first element. That results in a pointer to int
, which may be assigned to x
.
However, when an array is the operand of a sizeof
operator, a unary &
operator, or an _Alignof_
operator, it is not converted to a pointer to its first element. Also, an array that is a string literal being used to initialize an array is not converted to a pointer (so, in char foo[] = "abc";
, "abc"
is used as an array to initialize foo
; it is not converted to a pointer).
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