2015-09-20 2 views
2

Рассмотрим следующий код:разница Синтаксис между указателем на целочисленный массив и указатель на Int

int y = 20; 
int *pointer_of_y = y; //Intentionally missed & 
printf("%p\n",pointer_of_y); 
printf("%p\n",&y); 
printf("%d\n",*pointer_of_y); 

Выход:

0x14 //Value of 20 in hex 
0x7fff56747af8 //Address of Y Variable 
Segmentation fault: 11 //Value at pointer: Due to missing & 

Приведенный выше код не выполняется, потому что я пропустил & в указателе инициализация.

Давайте рассмотрим тот же код, если он инициализирован как массив.

int x[]= {10,20,30,40}; 
int *pointer_of_x = x; 
printf("%p\n",pointer_of_x); 
printf("%p\n",&x); 
printf("%d\n",*pointer_of_x); 

Выход:

0x7fff5b5eaad0 //Pointer value 
0x7fff5b5eaad0 //Address of x 
10 //Value at address pointed 

Как второй пример работы, даже если я пропустил & в указатель инициализации. Почему создание массива имеет значение?

ответ

4

Когда имя массива используется в контексте выражения, отличном от операнда до sizeof или &, оно распадается на pointer на его первый элемент.

Так вот -

int x[]= {10,20,30,40}; 

x даст адрес первого элемента массива и имеет тип int *. Поэтому это работает -

int *pointer_of_x = x; //works 
+0

Я бы удалить «* имя *», поскольку название не имеет значения в данном контексте. – alk

+0

@alk Я думаю, что это релевантно, но более точным будет * идентификатор * –

+0

@FelixPalmen: В C имена или идентификаторы предназначены только для синтаксического анализатора. «* Выражение, оценивающее массив *». – alk

2

Если массив типа T присваивается указатель типа T* то массив распадается на адрес его 1-й элемента.

Смежные вопросы