Сообщение Re: [plain C] Формализация термина «указатель». от 29.08.2015 15:16
Изменено 29.08.2015 15:18 SaZ
Здравствуйте, DirtyGarry, Вы писали:
DG>Коллеги, помогите разложить по полочкам термин «указатель». У меня получается вот такое многообразие, правильность которого хотелось бы обсудить.
DG>4...
DG>У указателя-переменной тип задается при описании. А каким образом он «выводится» у указателя-выражения?
DG>Спасибо
Правила определения типа выражения в зависимости от его состава расписаны практически в любой книге по Си. Нет разницы, какое у вас выражение: математическое или с адресной арифметикой.
Попробую объяснить "на пальцах":
Для того, чтобы получить "указатель-выражение" нужно иметь какой-либо исходный адрес. Т.е. в выражении должен присутствовать хотя-бы один указатель. Например:
Пример посложнее:
Нельзя складывать два указателя:
К указателям применимы операции сравнения и увеличения / уменьшения на число.
DG>Коллеги, помогите разложить по полочкам термин «указатель». У меня получается вот такое многообразие, правильность которого хотелось бы обсудить.
DG>4...
DG>У указателя-переменной тип задается при описании. А каким образом он «выводится» у указателя-выражения?
DG>Спасибо
Правила определения типа выражения в зависимости от его состава расписаны практически в любой книге по Си. Нет разницы, какое у вас выражение: математическое или с адресной арифметикой.
Попробую объяснить "на пальцах":
Для того, чтобы получить "указатель-выражение" нужно иметь какой-либо исходный адрес. Т.е. в выражении должен присутствовать хотя-бы один указатель. Например:
int a[10];
int *p = &a[0];
(p + 8) - 3 * 2; // "Укказатель-выражение" возвращает тип (int *), точно такой же, как и тип переменной p;
Пример посложнее:
( (short *)0xb80000000 ) + 10; // тип short *
char *pchar = (char *)( (short *)0xb80000000 + 10 );
char ch = *pchar; // 10-й символ на экране в текстовом режиме
Нельзя складывать два указателя:
int a[2];
int *p1 = &a[0], *p2 = &a[1];
int *p = p1 + p2; // ошибка
//////////////////////////////////
int a;
double b;
int *p1 = &a
double *p2 = &b;
int *p = p1 + p2; // тоже ошибка
К указателям применимы операции сравнения и увеличения / уменьшения на число.
Re: [plain C] Формализация термина «указатель».
Здравствуйте, DirtyGarry, Вы писали:
DG>Коллеги, помогите разложить по полочкам термин «указатель». У меня получается вот такое многообразие, правильность которого хотелось бы обсудить.
DG>4...
DG>У указателя-переменной тип задается при описании. А каким образом он «выводится» у указателя-выражения?
DG>Спасибо
Правила определения типа выражения в зависимости от его состава расписаны практически в любой книге по Си. Нет разницы, какое у вас выражение: математическое или с адресной арифметикой.
Попробую объяснить "на пальцах":
Для того, чтобы получить "указатель-выражение" нужно иметь какой-либо исходный адрес. Т.е. в выражении должен присутствовать хотя-бы один указатель. Например:
Пример посложнее:
Нельзя складывать два указателя:
--------------------
К указателям применимы операции сравнения и увеличения / уменьшения на число.
--------------------
DG>Коллеги, помогите разложить по полочкам термин «указатель». У меня получается вот такое многообразие, правильность которого хотелось бы обсудить.
DG>4...
DG>У указателя-переменной тип задается при описании. А каким образом он «выводится» у указателя-выражения?
DG>Спасибо
Правила определения типа выражения в зависимости от его состава расписаны практически в любой книге по Си. Нет разницы, какое у вас выражение: математическое или с адресной арифметикой.
Попробую объяснить "на пальцах":
Для того, чтобы получить "указатель-выражение" нужно иметь какой-либо исходный адрес. Т.е. в выражении должен присутствовать хотя-бы один указатель. Например:
int a[10];
int *p = &a[0];
(p + 8) - 3 * 2; // "Укказатель-выражение" возвращает тип (int *), точно такой же, как и тип переменной p;
Пример посложнее:
( (short *)0xb80000000 ) + 10; // тип short *
char *pchar = (char *)( (short *)0xb80000000 + 10 );
char ch = *pchar; // 10-й символ на экране в текстовом режиме
Нельзя складывать два указателя:
int a[2];
int *p1 = &a[0], *p2 = &a[1];
int *p = p1 + p2; // ошибка
//////////////////////////////////
int a;
double b;
int *p1 = &a
double *p2 = &b;
int *p = p1 + p2; // тоже ошибка
--------------------
К указателям применимы операции сравнения и увеличения / уменьшения на число.
--------------------