简体   繁体   中英

When I point a pointer to an array. Why does the pointer and the index[0] of the array I am pointing to have different memory addresses?

#include <stdio.h>

int main()
{
int arr[5];
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;

int *p = &arr;

printf("Memory address of first index: %p\n", &arr[0]);
printf("Memory address of pointer: %p\n", &p);

return 0;
}

OUTPUT Memory address of first index: 000000000061FE00 Memory address of pointer: 000000000061FDF8

They are are not the same. Is my machine bad?

arr is an array. It and its elements start at some place in memory.

p is a pointer to the array. Its value is an address. That address needs to be stored somewhere else in memory. That place is different from where the array is stored.

printf("%p\n", (void *) p); prints the value of p , which will be the address of arr (and of &arr[0] , since the first element is at the start of the array).

printf("%p\n", (void *) &p) prints the address of p , which is where p is.

First of all the compiler should issue a message relative to this declaration

int *p = &arr;

The problem is that the right hand side expression has the type int( * )[5] while the initialized object has the type int * and there is no implicit conversion between these two pointer types.

You should write either

int *p = arr;

In this case the array designator is implicitly converted to a pointer to its first element. Or

int ( *p )[5] = &arr;

The pointer p occupies its own extent of memory. So its address is different from the address of the extent of the memory occupied by the array arr .

On the other hand, if you will output the value stored in the pointer p like for example

printf("Memory address stored in the pointer p: %p\n", ( void * )p);

then it will be equal to the address of the first element of the array arr

printf("Memory address of first index: %p\n", ( void )&arr[0]);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM