crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

rp80
  опции профиля:
сообщение 26.10.2011, 23:35
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Упражнения из страуструпа. Подскажите пожалуйста все ли тут верно?

//указатель на массив char
typedef char* PARChar;

//Массив из из семи указателей на целые
typedef int* P7Aint[7];

//Указатель на массив из 7 указателей на целые
typedef int* P7PAint[7];
//То же самое, что и предыдущее ибо
    int a=3;
    P7Aint p7;
    p7[0]=&a;
    int** pp7=p7;//Указатель на массив из 7ми указателей



//Массив из 8ми массивов по 7ми указателей на целые чила
typedef int *P78int[8][7];



И еще 1 вопрос. Можно ли инициализировать тип typedef int* PT[] не списком не инициализации?
Пример:
    int* pc[6];
    pc[0]=new int[20];
    pc[0][1]=5;
//Можно ли также инициализировать и с typedef?

typedef int* PT[];
int b=5;
PT pt1={&b,&b,&b};//Ok
PT pt2=new int*[10];//Error
PT pt3[10];//Error


Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Iron Bug
  опции профиля:
сообщение 27.10.2011, 12:48
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Про скобки:
Приоритет оператора [] выше приоритета *.
Поэтому выражение
typedef int *P7PAint[7];

означает массив из семи указателей на int.

Фактически получается int (*(P7PAint[7])) (скобки расставлены так, как это воспринимает компилятор). Начинаем разворачивать скобки, начиная с наружних. Получается, что выражение *P7PAint[7] есть int. Далее, выражение P7PAint[7] есть int*. То есть, каждый элемент P7PAint имеет тип int* - указатель на тип int.

Чтобы объявить указатель на массив, нужно указать компилятору, чего мы хотим, и расставить приоритеты:
typedef int (*P7PAint)[7];

Вот теперь это один указатель на массив из семи int-ов. То есть, приритеты выглядят так: int ((*P7PAint)[7]). Это означает, что (*P7PAint)[7] имеет тип int (каждый элемент массива (*P7PAint)[7] есть целое число), то есть, *P7PAint имеет тип int[7] . То есть, P7PAint есть указатель на массив из 7 элементов типа int, что и требовалось.

да, кстати:
при указателе на массив на стеке (определённый через []) размер массива должен быть явно указан. потому что выражение int (*foo)[] в общем смысле не может быть размещено компилятором как самостоятельный объект в памяти. его можно использовать только как указатель на уже готовую структуру данных, например, как-то так:
typedef int (*FOO)[];

int data[]={1,2,3};

FOO foo=(int(*)[])data;

cout << *(*foo+0) << " " << *(*foo+1) << " " << *(*foo+2) << endl;

но это вряд ли принесёт особую выгоду, ибо тут можно просто запутаться.

Сообщение отредактировал Iron Bug - 27.10.2011, 12:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 22.6.2025, 14:42