[plain C] Формализация термина «указатель».
От: DirtyGarry  
Дата: 29.08.15 14:54
Оценка:
Коллеги, помогите разложить по полочкам термин «указатель». У меня получается вот такое многообразие, правильность которого хотелось бы обсудить.

1.
Указатель – это адрес.

2.
Указатель-переменная – это переменная, которая содержит адрес «объекта». Как и у любой переменной у нее есть тип. Под «объектом» понимается переменная соответствующего типа или область памяти в «куче».

Указатель-выражение – это выражение, результатом вычисления которого является адрес.

int a = 1;
int *p = &a;

// p – указатель-переменная типа int.
// &a – указатель-выражение


3.
Часто в книгах/статьях/etc все это просто называют термином «указатель», не добавляя «переменную» или «выражение».

4.
У указателя-переменной тип задается при описании. А каким образом он «выводится» у указателя-выражения?

Спасибо
Re: [plain C] Формализация термина «указатель».
От: SaZ  
Дата: 29.08.15 15:16
Оценка:
Здравствуйте, 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; // тоже ошибка


--------------------
К указателям применимы операции сравнения и увеличения / уменьшения на число.
--------------------
Отредактировано 29.08.2015 15:18 SaZ . Предыдущая версия . Еще …
Отредактировано 29.08.2015 15:17 SaZ . Предыдущая версия .
Re: [plain C] Формализация термина «указатель».
От: B0FEE664  
Дата: 31.08.15 09:21
Оценка: +1
Здравствуйте, DirtyGarry, Вы писали:

DG>Коллеги, помогите разложить по полочкам термин «указатель». У меня получается вот такое многообразие, правильность которого хотелось бы обсудить.


DG>1.

DG>Указатель – это адрес.

Нет. Адрес — это число, а указатель — это нечто, содержащие адрес.

DG>2.

DG>Указатель-переменная – это переменная, которая содержит адрес «объекта». Как и у любой переменной у нее есть тип. Под «объектом» понимается переменная соответствующего типа или область памяти в «куче».
Да.

DG>Указатель-выражение – это выражение, результатом вычисления которого является адрес.

Можно и так сказать.

DG>int a = 1;

DG>int *p = &a;

DG>// p – указатель-переменная типа int.

нет. p – указатель-переменная типа int*

DG>// &a – указатель-выражение

Обычно говорят, что выражение &a — это выражения взятия адреса, результатом которого является указатель на a.
А, вот, например, (p+1) — указатель-выражение.

DG>3.

DG>Часто в книгах/статьях/etc все это просто называют термином «указатель», не добавляя «переменную» или «выражение».
Бывает.

DG>4.

DG>У указателя-переменной тип задается при описании. А каким образом он «выводится» у указателя-выражения?
Думаю, надо различать две вещи: операция взятие адреса и конвертация типа указателя в другой тип.
И каждый день — без права на ошибку...
Re[2]: [plain C] Формализация термина «указатель».
От: rising_edge  
Дата: 31.08.15 18:18
Оценка: 1 (1) +1
Здравствуйте, SaZ, Вы писали:

SaZ>Нельзя складывать два указателя:


SaZ>--------------------

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

Также определена разность указателей (тип ptrdiff_t).
Re: [plain C] Формализация термина «указатель».
От: smeeld  
Дата: 31.08.15 20:33
Оценка:
Здравствуйте, DirtyGarry, Вы писали:


DG>1.

DG>Указатель – это адрес.

N
Указатель-это целая философия.
Re[2]: [plain C] Формализация термина «указатель».
От: Erop Россия  
Дата: 01.09.15 19:27
Оценка:
Здравствуйте, B0FEE664, Вы писали:


BFE>Нет. Адрес — это число, а указатель — это нечто, содержащие адрес.

Адрес не обязан быть числом. Память может быть сегментной...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: [plain C] Формализация термина «указатель».
От: pagid Россия  
Дата: 02.09.15 06:51
Оценка:
Здравствуйте, Erop, Вы писали:

E>Адрес не обязан быть числом. Память может быть сегментной...

Пусть пара чисел, ничего же не меняется, за исключением некоторых ограничений адресной арифметики.
Re: [plain C] Формализация термина «указатель».
От: мыщъх США http://nezumi-lab.org
Дата: 02.09.15 07:36
Оценка:
Здравствуйте, DirtyGarry, Вы писали:

DG>Коллеги, помогите разложить по полочкам термин «указатель». У меня получается вот такое многообразие, правильность которого хотелось бы обсудить.


DG>1.

DG>Указатель – это адрес.
ага щас блин. вот и выросло поколение которое не знает что такое near и far указатели и для вас сейчас все указатели это near. это не адрес. это индекс.

DG>2.

DG>Указатель-переменная – это переменная, которая содержит адрес "объекта"
нет там никакого адреса.

> Как и у любой переменной у нее есть тип.

какой тип у *void? это ж прямое указание на то, что типа нет

DG>Указатель-выражение – это выражение, результатом вычисления которого является адрес.

это по ходу дела уже ваша терминология

DG>int *p = &a;

DG>// p – указатель-переменная типа int.
указатель на тип int.

DG>// &a – указатель-выражение

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


DG>У указателя-переменной тип задается при описании. А каким образом он «выводится» у указателя-выражения?

если a это int, то указатель на a очевидно int*. если a это int, b это char, то &(a+b) -- ошибка компиляции очевидно.
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] Формализация термина «указатель».
От: Erop Россия  
Дата: 02.09.15 08:02
Оценка: +1
Здравствуйте, pagid, Вы писали:

P>Пусть пара чисел, ничего же не меняется, за исключением некоторых ограничений адресной арифметики.


ID сегмента свойствами числа обладать не обязан...

В общем случае С-шный адрес более сложная структура, чем число... Стоит об этом помнить...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: [plain C] Формализация термина «указатель».
От: McQwerty Россия  
Дата: 02.09.15 09:58
Оценка:
Здравствуйте, Erop, Вы писали:

P>>Пусть пара чисел, ничего же не меняется, за исключением некоторых ограничений адресной арифметики.

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

В компьютере — всё числа. Всегда можно raw-дамп получить.
Re[6]: [plain C] Формализация термина «указатель».
От: Erop Россия  
Дата: 02.09.15 10:11
Оценка:
Здравствуйте, McQwerty, Вы писали:

MQ>В компьютере — всё числа. Всегда можно raw-дамп получить.


Даже это не правда. Например ID сегмента может проверяться аппаратурой на валидность, просто при загрузке в соответствующий регистр. И сразу числа превратятся в слова Ну вроде 'APPL' и 'LINX'
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: [plain C] Формализация термина «указатель».
От: McQwerty Россия  
Дата: 02.09.15 11:18
Оценка: :)
Здравствуйте, Erop, Вы писали:

MQ>>В компьютере — всё числа. Всегда можно raw-дамп получить.

E>Даже это не правда. Например ID сегмента может проверяться аппаратурой на валидность, просто при загрузке в соответствующий регистр. И сразу числа превратятся в слова Ну вроде 'APPL' и 'LINX'

Уже, наверное, оффтопично, но! Числа _можно_ рассматривать как текст, числами они быть не перестают.
const unsigned i = 'APPL' + 'LINX'; // Вполе валидно.
Re[8]: [plain C] Формализация термина «указатель».
От: Erop Россия  
Дата: 02.09.15 11:55
Оценка:
Здравствуйте, McQwerty, Вы писали:

MQ>
MQ>const unsigned i = 'APPL' + 'LINX'; // Вполе валидно.
MQ>


А вот способа валлидно "складывать" или "вычитать" ID сегментов в С'шной модели памяти нет.
И даже если хакнешь и сложишьь как-то, получишь UB в результате, с вполне реалистичным аппаратным авостом на некоторых архитектурах...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: [plain C] Формализация термина «указатель».
От: pagid Россия  
Дата: 02.09.15 19:49
Оценка: +1
Здравствуйте, Erop, Вы писали:

E>В общем случае С-шный адрес более сложная структура, чем число... Стоит об этом помнить...

В общем случае С-шный адрес это то, что указывает на некоторый участок памяти и с чем возможна адресная арифметика.
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re[2]: [plain C] Формализация термина «указатель».
От: DirtyGarry  
Дата: 03.09.15 06:26
Оценка:
Здравствуйте, мыщъх, Вы писали:

DG>>1.

DG>>Указатель – это адрес.
М>ага щас блин. вот и выросло поколение которое не знает что такое near и far указатели и для вас сейчас все указатели это near. это не адрес. это индекс.

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

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

DG>>Указатель-выражение – это выражение, результатом вычисления которого является адрес.

М>это по ходу дела уже ваша терминология

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

Почему нельзя думать про указатель как про адрес? Те моменты, на которые Вы обращаете внимание, по-моему, имеют отношение к реализации компилятора. Или я не прав?
Re[5]: [plain C] Формализация термина «указатель».
От: DirtyGarry  
Дата: 03.09.15 06:28
Оценка:
Здравствуйте, Erop, Вы писали:

E>В общем случае С-шный адрес более сложная структура, чем число... Стоит об этом помнить...


Для чего?
Re[3]: [plain C] Формализация термина «указатель».
От: smeeld  
Дата: 03.09.15 06:41
Оценка: +2
Здравствуйте, DirtyGarry, Вы писали:

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



Мне нравится определение: указатель-абстрактная сущность, обеспечивающая адресацию объекта в системе ЯП
и реализуемая согласно особенностям конкретной аппаратной платформы.
Re[9]: [plain C] Формализация термина «указатель».
От: pagid Россия  
Дата: 03.09.15 07:08
Оценка:
Здравствуйте, Erop, Вы писали:

E>А вот способа валлидно "складывать" или "вычитать" ID сегментов в С'шной модели памяти нет.

Так и сегментов в С'шной модели памяти нет. Есть реализации более-менее удовлетворительно отображающие одно на другое.
Re[4]: [plain C] Формализация термина «указатель».
От: Шахтер Интернет  
Дата: 03.09.15 14:28
Оценка:
Здравствуйте, smeeld, Вы писали:

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


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



S>Мне нравится определение: указатель-абстрактная сущность, обеспечивающая адресацию объекта в системе ЯП

S>и реализуемая согласно особенностям конкретной аппаратной платформы.

Ключевое слово выделено. Адрес -- это и есть что-то, что позволяет идентифицировать объект.
Например, адрес на конверте. Как он устроен при этом -- это детали реализации.
Поэтому указатель -- это именно адрес переменной.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: [plain C] Формализация термина «указатель».
От: tehKosh  
Дата: 03.09.15 20:55
Оценка:
для формального определения можете "припасть к первоисточнику", положим ISO/IEC 9899
в пункте 6.2.5 определяется pointer type как вид derived type (производный тип? как лучше не знаю)
в 6.3.2.3 поясняются возможные преобразования указателей
в 6.7.5.1 поясняются описатели указателей pointer declarators который и используется для конструирования производных типов
в 6.5.3.2 поясняется операция разыменования *
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.