shafeeq
shafeeq

Reputation: 143

What is the size of pointer to an array of type int?

I have the following code

#include <stdio.h>
int main(void) {
    int arr[] = {10,20,30,40};
    int* ptr = arr;
    printf("%d\n",sizeof(arr));
    printf("%d",sizeof(ptr));
    return 0;
}

The output is

16
4

size of pointer in C is 4. 'arr' is also a pointer to an integer but its size comes out to be 16, which is product of size of one element and number of elements. On the other hand if I store the same pointer into another pointer variable then its size becomes 4. This is very confusing. The same thing happens if I try to send arr as an argument to a function and then print the size of arr in that function. How does C handle a pointer to an array?

Upvotes: 1

Views: 222

Answers (4)

ani627
ani627

Reputation: 6057

  • When you do sizeof(arr) you will get the size of array which is number of elements * size of int.
  • When you do sizeof(ptr) you will get the size of pointer which is size of int.

This is very confusing. The same thing happens if I try to send arr as an argument to a function and then print the size of arr in that function.

When you send the array like this foo(arr), you are actually sending the base address of arr. And when we pass address of a variable to a function, it will store the address in a pointer. So again if you try to get the size of arr you'll get the size of pointer.

Upvotes: 1

Sathish
Sathish

Reputation: 3870

sizeof only works to find the length of the array if you apply it to the original array.

int a[5]; //real array. NOT a pointer
sizeof(a); // :)

However, by the time the array decays into a pointer, sizeof will give the size of the pointer and not of the array.

int a[5];
int * p = a; // assigning address of the array to pointer
sizeof(p); // :(

It will return always 4 bytes on 32-bit system and 8 bytes on 64-bit system!

Arrays decaying into pointers when they are passed to a function and continuing to keep the array length in the type system.

When you pass an array to a function it decays to pointer. So the sizeof function will return the size of int *

So when you pass the array to the function you need to pass the Number of elements also-

void function (size_t sz, int *arr) { ... }
:
{
    int x[20];
    function (sizeof(x)/sizeof(*x), x);
}

Upvotes: 0

sepp2k
sepp2k

Reputation: 370102

'arr' is also a pointer to integer

No, it's not. arr is an array. The size of an array is the size of an element times the number of elements. If it were a pointer, it's size would be the same as any other pointer.

How does C handles pointer of array?

C handles pointers to arrays the same way it handles all other pointers. However there are no pointers to arrays in your code, only a pointer to int (ptr).

Upvotes: 5

Niels Keurentjes
Niels Keurentjes

Reputation: 41958

A pointer is just a memory address, therefore on 32-bit systems it is always 4 bytes. Depending on the environment it is 4 or 8 bytes on 64-bit systems.

There is no real confusion in your example. arr is an array of 4 32-bit integers, therefore 16 bytes. It is 'handled', or 'passed around', as a pointer to the first int, an int*, which is why you can copy it to other variables of that type, either explicitly or as a parameter. At which time there is no longer a relationship to the original array, and it is just a pointer - 4 bytes on your system.

The best way to look at it is that there is an implicit conversion possible from int[] to int*, like there is from char to int.

Upvotes: 3

Related Questions