2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Эквивалентны ли типы int * и int (*) [] (Си)?
Сообщение14.06.2011, 18:37 


17/11/09
82
Вопрос возник при чтении книги "ЯЗЫК ПРОГРАММИРОВАНИЯ C".

(Оффтоп)

А.8.8. Имена типов
В ряде контекстов (например, при явном приведении к типу, при указании типов параметров в объявлениях функций, в аргументе операции sizeof) возникает потребность в применении имени типа данных. Эта потребность реализуется с помощью имени типа, определение которого синтаксически почти совпадает с объявлением объекта того же типа, в котором только опущено имя объекта.

имя-типа:
список-спецификаторов-модификаторов абстрактный-описательнеоб

абстрактный-описатель:
указатель
указательнеоб собственно-абстрактный-описатель

собственно-абстрактный-описатель:
( абстрактный-описатель )
собственно-абстрактный-описательнеоб [ константное-выражениенеоб ]
собственно-абстрактный-описательнеоб ( список-типов-параметровнеоб )


Можно указать ровно одно место в абстрактном описателе, где мог бы находиться идентификатор, если бы данная конструкция была описателем в полноценном объявлении объекта. Именованный тип совпадает с типом этого предполагаемого идентификатора. Вот примеры:
Код:
int
int *
int * [3]
int (*) []
int *()
int (* [] ) (void)
Здесь объявляются соответственно типы "целое число" (int), "указатель на int", "массив из трех указателей на int", "указатель на массив из неизвестного количества элементов типа int", "функция неизвестного количества параметров, возвращающая указатель на int", "массив неизвестного размера, состоящий из указателей на функции без параметров, каждая из которых возвращает int".

 Профиль  
                  
 
 Re: Эквивалентны ли типы int * и int (*) [] (Си)?
Сообщение15.06.2011, 14:25 


16/06/10
199
В пункте A.8.10 Вашей книги об этом сказано, хотя и так, на уровне простой логики, понятно, что не эквивалентны: один тип -- "указатель на int", другой -- "указатель на массив".

 Профиль  
                  
 
 Re: Эквивалентны ли типы int * и int (*) [] (Си)?
Сообщение15.06.2011, 20:42 


31/10/10
3
Если в квадратных скобках нет константы, то int* будет эквивалентен int[], а int (*) [] будет скорее эквивалентен int**, наверное.

 Профиль  
                  
 
 Re: Эквивалентны ли типы int * и int (*) [] (Си)?
Сообщение15.06.2011, 22:46 
Заслуженный участник


04/05/09
4587
Мда.
int* и int[] эквивалентны только в описании параметра функции, причём константа в скобках будет проигнорована.

Во всех остальных случаях это разные типы:
int* - указатель на int;
int[] - массив из int.
Размер массива может быть опущен, например, при описании внешнего массива (extern int array[];).

Впрочем, выражение типа "массив" в большинстве случаев неявно преобразуется к указателю на первый элемент, поэтому разница не заметна. Исключения - особые операторы типа sizeof и typeid.

 Профиль  
                  
 
 Re: Эквивалентны ли типы int * и int (*) [] (Си)?
Сообщение04.07.2011, 18:06 


23/11/09
130
Ну типы то разные, но могут быть применены для одной и той же цели.
int[] удобно применять когда извесны параметры массива и он сразу создается.
int* Указатель на int, никто не спорит что это так, но! Его можно рассматривать и как указатель начального элемента массива созданного динамически.
В любом случае это адрес начала области памяти где содержатся данные.

 Профиль  
                  
 
 Re: Эквивалентны ли типы int * и int (*) [] (Си)?
Сообщение22.09.2011, 22:06 


17/05/11
158
faintelroy в сообщении #458012 писал(а):
Вопрос возник при чтении книги "ЯЗЫК ПРОГРАММИРОВАНИЯ C".

(Оффтоп)

А.8.8. Имена типов
В ряде контекстов (например, при явном приведении к типу, при указании типов параметров в объявлениях функций, в аргументе операции sizeof) возникает потребность в применении имени типа данных. Эта потребность реализуется с помощью имени типа, определение которого синтаксически почти совпадает с объявлением объекта того же типа, в котором только опущено имя объекта.

имя-типа:
список-спецификаторов-модификаторов абстрактный-описательнеоб

абстрактный-описатель:
указатель
указательнеоб собственно-абстрактный-описатель

собственно-абстрактный-описатель:
( абстрактный-описатель )
собственно-абстрактный-описательнеоб [ константное-выражениенеоб ]
собственно-абстрактный-описательнеоб ( список-типов-параметровнеоб )


Можно указать ровно одно место в абстрактном описателе, где мог бы находиться идентификатор, если бы данная конструкция была описателем в полноценном объявлении объекта. Именованный тип совпадает с типом этого предполагаемого идентификатора. Вот примеры:
Код:
int
int *
int * [3]
int (*) []
int *()
int (* [] ) (void)
Здесь объявляются соответственно типы "целое число" (int), "указатель на int", "массив из трех указателей на int", "указатель на массив из неизвестного количества элементов типа int", "функция неизвестного количества параметров, возвращающая указатель на int", "массив неизвестного размера, состоящий из указателей на функции без параметров, каждая из которых возвращает int".


быть может указатель на элементы массива и указатель на первый элемент массива ?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group