Re[3]: [plain C] Формализация термина «указатель».
От: мыщъх США http://nezumi-lab.org
Дата: 04.09.15 02:32
Оценка:
Здравствуйте, DirtyGarry, Вы писали:

DG>Здравствуйте, мыщъх, Вы писали:


DG>Указатель – это переменная, содержащая адрес другой переменной.

DG>Керниган, Ритчи "Язык программирования C", стр. 105. Авторы тоже не знали про near и far
ветхий завет да еще на русском языке? читайте в первоисточнике. near и far главным образом относятся к интел. адрес это сегмент (селектор) и смещение (оно же индекс). указатели в плоской модели памяти суть индексы. исключение составляет fs, который винда заюзала для своих целей. у него другой базовый адрес и лимиты нежели cs (код), ss (стек) и ds (данные).

на микроконтроллерах -- там и сегодня цырк с 8-, 16- и 24-битными указателями.
flash char string[] = "This string is stored in flash";
char flash *flashpointer; ; Declare flash pointer
flashpointer = &string[0]; ; Assign pointer to flash location

обратите на тип указателя -- flash. если бы указатели содержали адрес переменных, то зачем бы потребовалось дополнительно указывать, что это флеш? ведь и так ясно ж. но хочется экономить биты и юзать не адреса, а индексы.

DG>Выражение "pointer expression" встречается в стандарте C99. Возможно это мой корявый перевод...

гм, ну выражение-то встречается и даже раньше C99, но ему не придают специального смысла. это скорее к разбору a = ***b; ну и чтобы понять почему a[b] тождественно b[a] (например p[0] можно заменить на 0[p]) нужно свести это к выражению. потому что там тупо сумма берется. а от перестановки слагаемых...

DG>Почему нельзя думать про указатель как про адрес?

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

> Те моменты, на которые Вы обращаете внимание, по-моему, имеют отношение к реализации компилятора. Или я не прав?

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

если вы хотите понять что там происходит с указателями -- нужно хотя бы смотреть какие типы указателей поддерживает компилятор и позволяет ли "скрещивать" указатели разных типов в одном выражении. обычно не позволяет. потому что если foo и bar это 16 битные указатели (а по сути индексы 16 битных блоков памяти), то в них нет информации, позволяющей понять что там за блоки.

пускай foo указаывает на блок А, а bar на блок Б. выражение (*foo == *bar) лишено смысла. компилятор скорее всего использует какой-то один блок, а не два. это, разумеется, в случае коротких указателей. можно использовать длинные и проблемы не будет (в них будет базовый адрес блока в виде секлектора скорее всего), но это жуткой тормоз...
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[4]: [plain C] Формализация термина «указатель».
От: DirtyGarry  
Дата: 05.09.15 06:09
Оценка:
Здравствуйте, мыщъх, Вы писали:

DG>>Керниган, Ритчи "Язык программирования C", стр. 105. Авторы тоже не знали про near и far

М>ветхий завет да еще на русском языке? читайте в первоисточнике.

Что-то мне подсказывает, что в первоисточнике написано так же.

DG>>Почему нельзя думать про указатель как про адрес?

М>потому что это даже у рихтера описано.

Можете сказать, где именно посмотреть и что искать?

>> Те моменты, на которые Вы обращаете внимание, по-моему, имеют отношение к реализации компилятора. Или я не прав?

М>их приходится учитывать когда вы работате с указателями разных типов. это выходит за рамки стандарта. но это реальность. и с ней приходится считаться.

Правильно ли я понимаю, что Вы говорите про strict aliasing rules, restrict и т.п.? Если да, то получается, что если вы не разработчик компилятора или вам не нужно написать какой-то хитро эффективный код, вы вполне можете обойтись представлением об указателе как об адресе в некотором «абстрактном адресном пространстве». Кроме того, код, который нарушает strict aliasing rules, по-моему, должен приводить к неопределенному поведению.

Написал, а потом задумался . Я главным образом пишу про разработку прикладных приложений, а что там в ядре – большой вопрос. Но, по-моему, все равно должен быть какой-то уровень абстракции, только после которого появятся селекторы, сегменты и т.п.
Re[4]: [plain C] Формализация термина «указатель».
От: swingus  
Дата: 08.09.15 07:58
Оценка:
Да не мыщъх, посоны тебе правильно толкуют. Это детали реализации. Адрес не обязательно число, адрес может может быть чем угодно. Главное, чтобы были реализованы операции (address) +/- (offset) = (address), (address) — (address) = (offset), *(address) = (something). Остальные операции зависят от реализации.

Здравствуйте, мыщъх, Вы писали:

М>ветхий завет да еще на русском языке? читайте в первоисточнике. near и far главным образом относятся к интел. адрес это сегмент (селектор) и смещение (оно же индекс). указатели в плоской модели памяти суть индексы. исключение составляет fs, который винда заюзала для своих целей. у него другой базовый адрес и лимиты нежели cs (код), ss (стек) и ds (данные).
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.