Reputation: 113
I have learnt that the name of the array is actually the address of array_name[0]
. Then why does is require to add ampersand sign before the name of the array while initializing a pointer to the array.
int (*pointer_name)[5] = &array_name;
I have tried:
int *pointer_name = array_name;
and it works fine. What is the difference between the two other than the "type of pointer"? And also what are the pros-cons of either of them. When to use them? Does anyone of them has got any greater/ better functionality over other?
Upvotes: 3
Views: 73
Reputation: 310930
The type of the object pointed to by the pointer declared like
int (*pointer_name)[5] = &array_name;
is int[5]
. This means for example that this operator
sizeof( *pointer_name )
yields the value equal to 5 * sizeof( int )
. And that if to use the pointer arithmetic as for example pointer_name + 1
then the address obtained by this expression will be equal to the address stored in the pointer plus value of 5 * sizeof( int )
.
The type of the object pointed to by the pointer declared like
int *pointer_name = array_name;
is int
. This means for example that this operator
sizeof( *pointer_name )
yields the value equal to sizeof( int )
. And that if to use the pointer arithmetic as for example pointer_name + 1
then the address obtained by this expression will be equal to the address stored in the pointer plus value of sizeof( int )
.
A pointer declared like this
int (*pointer_name)[5];
usually used for two-dimensional arrays that points to "rows" of array.
For example
int array_name[2][5];
int (*pointer_name)[5] = array_name;
// outputs 20 provided that sizeof( int ) is equal to 4
printf( "%zu\n", sizeof( *pointer_name ) );
// outputs 4 provided that sizeof( int ) is equal to 4
printf( "%zu\n", sizeof( **pointer_name ) );
pointer_name
points to the first row of the array array_name
. pointer_name + 1
points to the second row of the array.
Upvotes: 0
Reputation: 36391
int *pointer_name = array_name;
declares a pointer to int
that points to the first int
of the array array_name
.
int (*pointer_name)[5] = &array_name;
declares a pointer to an array of 5 int
s that points to the array array_name
.
Addresses are the same but types not.
If you use pointer arithmetic on those you have, in the first case:
pointer_name++;
will just point to the second int
of the array, while in the second case it
will point just after the whole array.
Upvotes: 3
Reputation: 121357
Then why does is require to add ampersand sign [..]. I have tried : int *pointer_name = array_name; And it works fine.
Because the types are different.
&array_name
is a pointer to an array of 5 ints and has type: int (*)[5]
.
array_name
gets converted into a pointer to its first element when you assign it to pointer_name
(which is equivalent to &array_name[0]
) and has type: int*
.
If array_name
is an array of 5 ints then both:
int (*pointer_name)[5] = &array_name;
and
int *pointer_name = array_name;
are valid. Just how you'd access them later through these two pointers is different.
Upvotes: 2