crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
Алексей1153
  опции профиля:
сообщение 27.10.2011, 9:34
Сообщение #11


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

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

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




Репутация:   34  


Iron Bug, а покажи пример с круглыми, когда это не будет похоже на объявление типа указателя на функцию, я что-то в сомнениях ))

а небольшие массивы на стеке иногда использую, но работаю с ними через указатель и размер массива. Привычнее и нагляднее )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 27.10.2011, 12:08
Сообщение #12


Студент
*

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

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




Репутация:   0  


Цитата(Iron Bug @ 27.10.2011, 8:05) *
Цитата
//Указатель на массив из 7 указателей на целые
typedef int* P7PAint[7];

это неверно.

Спасибо за ответ.

Но смотри. Первая строчка "Указатель на массив чар". char* PARChar;. У тебя возражений не вызвала. Предыдущее задание было массив чар(я не стал его писать из-за очевидности). Там, соответственно, такое же объявление: char* PChar;

Ну а далее ведь тоже самое.
int v[5];
int* pv;=v//Ok

int* P7Aint[7];//Массив указателей
int** pP7=P7Aint;//Указатель на массив указателей

//Или ты имеешь в виду что-то вроде этого?
int* (*P7PAint)[7]=P7Aint[7];//Это работает, но если честно, не очень понятно как.

Если последнее верно, не мог бы ты разжевать что именно происходит здесь с расставлением скобок?

Цитата(Iron Bug @ 27.10.2011, 8:05) *
во втором случае: так делать нельзя, ибо размер массива должен быть константным. компилятор заранее не знает его и требует точного размера.

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

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


Здесь вроде дошло наконец..

Спасибо


int* (*P7PAint)[7]=&P7Aint[7];

Только вот так, конечно.

Тогда и "Указатель на массив чар" надо, по идее определять так:

char c[5];
char (*pc)[5]=&c;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 27.10.2011, 12:48
Сообщение #13


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

Группа: Модератор
Сообщений: 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 27.10.2011, 14:47
Сообщение #14


Студент
*

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

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




Репутация:   0  


Все понятно, наконец, спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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