Информация об изменениях

Сообщение Re: [plain C] Формализация термина «указатель». от 29.08.2015 15:16

Изменено 29.08.2015 15:18 SaZ

Здравствуйте, DirtyGarry, Вы писали:

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>Спасибо

Правила определения типа выражения в зависимости от его состава расписаны практически в любой книге по Си. Нет разницы, какое у вас выражение: математическое или с адресной арифметикой.
Попробую объяснить "на пальцах":
Для того, чтобы получить "указатель-выражение" нужно иметь какой-либо исходный адрес. Т.е. в выражении должен присутствовать хотя-бы один указатель. Например:
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; // тоже ошибка


--------------------
К указателям применимы операции сравнения и увеличения / уменьшения на число.
--------------------