Указатели и массивы. Упражнения из страуструпа.
От: rp80  
Дата: 26.10.11 11:44
Оценка:
//указатель на массив 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[4];//Error


Спасибо.
Re: Указатели и массивы. Упражнения из страуструпа.
От: rg45 СССР  
Дата: 27.10.11 05:53
Оценка:
Здравствуйте, rp80, Вы писали:

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

R>//Указатель на массив из 7 указателей на целые
R>typedef int* P7PAint[7];
R>//То же самое, что и предыдущее ибо
R>

R>Все верно?

Нет, не верно. Нужно четко различать три разных типа: 1) массив; 2) указатель на массив; 3) указатель на элемент массива, который получается при приведении массива к указателю:
int* array[7]; //Массив из из семи указателей на целые
int* (*ponter_to_array)[7] = &array; //Указатель на массив из из семи указателей на целые
int** pointer_to_element = array; //Указатель на элемент массива

Надо заметить, что адреса, хранящиеся в указателе на массив и указателе на элемент массива, могут быть одинаковыми (но не обязаны). Но как бы то ни было, никогда не нужно забывать, что это разные типы.
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Указатели и массивы. Упражнения из страуструпа.
От: rp80  
Дата: 27.10.11 08:44
Оценка:
Здравствуйте, rg45, Вы писали:

R>Нет, не верно. Нужно четко различать три разных типа: 1) массив; 2) указатель на массив; 3) указатель на элемент массива, который получается при приведении массива к указателю:

R>
R>int* array[7]; //Массив из из семи указателей на целые
R>int* (*ponter_to_array)[7] = &array; //Указатель на массив из из семи указателей на целые
R>int** pointer_to_element = array; //Указатель на элемент массива
R>

R>Надо заметить, что адреса, хранящиеся в указателе на массив и указателе на элемент массива, могут быть одинаковыми (но не обязаны). Но как бы то ни было, никогда не нужно забывать, что это разные типы.

Спасибо. Вроде понятно. А насчет второго вопроса? Невозможно из-за несоответсвия типов?
Re: Указатели и массивы. Упражнения из страуструпа.
От: rg45 СССР  
Дата: 27.10.11 12:23
Оценка:
Здравствуйте, rp80, Вы писали:


R>И еще 1 вопрос. Можно ли инициализировать тип typedef int* PT[] не списком не инициализации?

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

R>typedef int* PT[];
R>int b=5;
R>PT pt1={&b,&b,&b};//Ok
R>PT pt2[4];//Error
R>


Здесь было бы все правильно, если бы при определении типа PT ты задал какое-то значение размера массива. Ошибка как раз и возникает из-за того, что элемент массива pt2 не имеет определенного размера.
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.