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


Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 9)
Iron Bug
  опции профиля:
сообщение 27.10.2011, 7:05
Сообщение #2


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

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

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




Репутация:   12  


Цитата
//Указатель на массив из 7 указателей на целые
typedef int* P7PAint[7];

это неверно.

во втором случае: так делать нельзя, ибо размер массива должен быть константным. компилятор заранее не знает его и требует точного размера.

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

определение PT pt3[10] пытается создать массив из 10 элементов типа PT, но размер каждого элемента неизвестен заранее, а и компилятор просто не может выделить память под такой массив.

Сообщение отредактировал Iron Bug - 27.10.2011, 7:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.10.2011, 7:09
Сообщение #3


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

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата
//Указатель на массив из 7 указателей на целые
typedef int* P7PAint[7];


не, вот так будет правильно:

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

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


Сообщение отредактировал Алексей1153 - 27.10.2011, 7:09
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 27.10.2011, 7:13
Сообщение #4


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

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

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




Репутация:   12  


Цитата(Алексей1153 @ 27.10.2011, 9:09) *
не, вот так будет правильно:

нет. это будет массив из 7 указателей на массивы из 7 указателей :) достаточно просто расставить скобки, на самом деле.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.10.2011, 7:28
Сообщение #5


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

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


ну да, звёздочка лишняя
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 27.10.2011, 8:11
Сообщение #6


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

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

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




Репутация:   12  


Цитата(Алексей1153 @ 27.10.2011, 9:28) *
ну да, звёздочка лишняя

да не только. вообще, в принципе не то.

достаточно двух скобок в исходном выражении, чтобы стало правильно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.10.2011, 8:26
Сообщение #7


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

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Iron Bug, скобки - ну нафиг, начинается путаница с объявлением функции вечно ) А я - за простоту и читаемость

предпочитаю определить лесенку понятных типов, чем корявую многоэтажку
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 27.10.2011, 8:49
Сообщение #8


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

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

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




Репутация:   12  


Цитата(Алексей1153 @ 27.10.2011, 10:26) *
предпочитаю определить лесенку понятных типов, чем корявую многоэтажку

это НЕ лесенка. массив указателей и указатель на массив никак не связаны меж собой. это просто разные типы. и лесенка тут совершенно никуда не упирается.
единственный способ определить указатель на массив - использовать скобки. потому что приоритет оператора [] выше приоритета взятия значения указателя *

Сообщение отредактировал Iron Bug - 27.10.2011, 8:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.10.2011, 9:12
Сообщение #9


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

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


а, ты про квадратные скобки ))

ну если честно, я не пользуюсь такими типами, как type[] , у меня только указатели. И я сейчас путаюсь с непривычки

под лесенкой я подразумеваю следующее: не городить в одну строчку указатель на тип-перетип, а определить конкретный тип, а затем массив элементов этого типа, либо массив указателей на этот тип. Но вот квадратных скобок в определении типа typedef у меня точно не будет

Цитата
единственный способ определить указатель на массив


нифига подобного:

int** pp; //указатель на массив указателей на int
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 27.10.2011, 9:30
Сообщение #10


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

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

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




Репутация:   12  


Цитата(Алексей1153 @ 27.10.2011, 11:12) *
а, ты про квадратные скобки ))

нет. про круглые. и про определения массивов указателей и указателей на массивы.
и лесенки тут ни при чём.

Цитата(Алексей1153 @ 27.10.2011, 11:12) *
int** pp; //указатель на массив указателей на int

это указатель без фиксированного размера. а разговор идёт про массивы, которые называют array. компилятор с ними совсем по-другому работает. это массивы с фиксированным размером, создаваемые в стеке. и они определяются только через скобки. указатели приводятся только в одну сторону: от фиксированных к динамическим, но не наоборот. иногда имеет смысл применять фиксированные (это быстрее).

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

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


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


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