Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2010, 10:42   #1
Valter
Пользователь
 
Регистрация: 29.03.2008
Сообщений: 51
По умолчанию Объявление указателей

Доброго всем дня!

В книге Шилдта наткнулся на замечание, что для того чтобы объявить указатель на 2-х мерный массив (например, из int), необходимо использовать следующую запись (скобки обязательны!):

Код:
int (*ptr)[5];
Вопрос вот в чем: Почему нельзя объявить его так:

Код:
int *ptr[5];
?

В первом случае: указатель на массив из 5-ти элементов типа int, во втором: массив из 5-ти указателей на int.

Но ведь во втором случае никто не запрещает каждый из элементов массива указателей ptr[] рассматривать как начало одномерного массива из int.

То есть, к примеру, в первом случае при ptr++ мы сдвигаемся к следующему одномерному массиву из int, во втором при ptr++ получается то же самое.


NOTE: в книге Кернигана и Ритчи написано (глава "Сложные объявления"):
Код:
int (*daytab)[13];
    daytab: указ. на массив[13] из int

int (*daytab)[13];
    daytab: массив[13] из указ. на int
То есть разницы никакой и скобки вокруг указателя необязательны (другое дело, когда объявляется указатель на функцию, там скобки нужны):
Код:
void *comp();
    comp: функц. возвр. указ. на void

void (*comp)();
    comp: указ. на функц. возвр. void

Последний раз редактировалось Valter; 04.04.2010 в 10:45.
Valter вне форума Ответить с цитированием
Старый 04.04.2010, 11:07   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

можно обьявлять как угодно.
int *ptr1[5]; //массив из 5 элементов,каждый из его элементов является указателем.
выделить память можно так:
for(int i=0;i<5;i++){
ptr1[i]=new int[20];
получили массив 5х20

int (*ptr)[5]; //указатель на массив из пяти элементов.
Выделить память можно так:
ptr=new int[20][5]; //получили массив 20х5

ИМХО удобней писать int **ptr2;
rrrFer вне форума Ответить с цитированием
Старый 04.04.2010, 11:26   #3
Valter
Пользователь
 
Регистрация: 29.03.2008
Сообщений: 51
По умолчанию

То есть, с точки зрения чисто объявления и синтаксиса языка объявления, к примеру,
Код:
void *comp();
и
Код:
void (*comp)();
неравнозначны.

Равнозначны ли тогда или нет объявления для ptr:

Код:
int *ptr[5];
и
Код:
int (*ptr)[5];
?
Valter вне форума Ответить с цитированием
Старый 04.04.2010, 11:55   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

в первом случае получаем массив указателей, во втором указатель на массив
rrrFer вне форума Ответить с цитированием
Старый 04.04.2010, 12:00   #5
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
void (*comp)();
это вообще указатель на функцию. А что бы функция возвращала указатель на двумерный массив нужно так:
Код:
int** f();
Код:
void*
указатель на неопределенный тип.

Последний раз редактировалось profi; 04.04.2010 в 12:02.
profi вне форума Ответить с цитированием
Старый 04.04.2010, 12:09   #6
Valter
Пользователь
 
Регистрация: 29.03.2008
Сообщений: 51
По умолчанию

Разобрался, спасибо. На самом деле, всю заковыку составили неправильные объявления у Кернигана и Ритчи:
Код:
int (*daytab)[13];
    daytab: указ. на массив[13] из int

int (*daytab)[13];
    daytab: массив[13] из указ. на int
По всей видимости, у них тут опечатка во втором случае, так как должно быть так:

Код:
int (*daytab)[13];
    daytab: указ. на массив[13] из int

int *daytab[13];
    daytab: массив[13] из указ. на int

У них же есть и объяснение различия в книге:
Цитата:
Код:
f(int (*daytab)[13]) {...}
Последняя запись объявляет, что параметр есть указатель на массив из 13 значений типа int. Скобки здесь необходимы, так как квадратные скобки [] имеют более высокий приоритет, чем *. Без скобок объявление

Код:
int *daytab[13]
определяет массив из 13 указателей на char.

Еще раз спасибо!


profi
Указатель на функцию я приводил, чтобы подчеркнуть разницу при использовании/не использовании скобок в объявлениях. Вопрос касался аспекта, есть ли такая разница в случае массивов указателей. Теперь все установлено и на своих местах. Просто опечатка в основополагающей книге ввела меня в заблуждение.

Последний раз редактировалось Valter; 04.04.2010 в 12:12.
Valter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объявление процедуры Progs1024 Общие вопросы Delphi 11 02.12.2009 14:44
Объявление класса Александр Елис Помощь студентам 2 22.10.2009 21:58
Объявление функции Rekky Общие вопросы C/C++ 5 30.09.2009 16:59
объявление процедуры AIst Общие вопросы Delphi 4 16.01.2009 14:12