Форум программистов, компьютерный форум CyberForum.ru

Разный доступ к элементам структуры через указатель - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Буфер обмена и jpeg http://www.cyberforum.ru/cpp-beginners/thread623493.html
Подскажите, пожалуйста, как в Win32 C++ получить из буфера обмена HBITMAP и сохранить его как jpeg файл со сжатием
C++ Составить программу, для вычисления значений функции Составить программу, для вычисления значений функции у=(х2-2х+5)(х-3) при изменении аргумента х еще -8 до +6 с шагом 0.01. http://www.cyberforum.ru/cpp-beginners/thread623492.html
C++ Открытие соединенных com портов
Скажите пожалуйста, если на одном компьютере соединены 2 com порта между собой и один из них уже используется программой для принятия данных, помешает ли этот факт второй программе открыть незанятый com порт для передачи данных? Просто у меня порт почему то не смог открыться для передачи.
C++ Определить средний балл по каждому предмету
В сессию m студентов одной группы сдали 5 экзаменов. Результаты сессии представлены в виде матрицы N (m 5). Определить средний балл по каждому предмету.
C++ Сформировать массив... http://www.cyberforum.ru/cpp-beginners/thread623470.html
Сформировать массив К, размерности N M; причем элементы первой строки – нулевые второй – единичные, м – 0 – (м – 1).
C++ Все отрицательные элементы массива уменьшить в двое, а все нулевые элементы заменить на... Задан массив М, состоящий из К строк и N столбцов. Все отрицательные элементы уменьшить в двое, а все нулевые элементы заменить на – 0.1. подробнее

Показать сообщение отдельно
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.07.2012, 20:01     Разный доступ к элементам структуры через указатель
последнее объяснение какое-то мутное и не объясняет, почему для указателей обращение к мебмерам через стрелку, а для объектов - через точку. Такое поведение пришло из си, а почему там так сделано - хз. Теоретически, ничто не мешает сделать все обращения как через стрелку, так и через точку. Ведь компилятор знает тип объекта а значит, в зависимости от типа может применить то, или иное правило обращения к мемберу структуры. Хотя даже эти правила одинаковые. А именно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Допустим, что нет никаких вырваниваний и прочих тонкостей компоновки объектов в памяти
struct Foo
{
  Byte firstByte;
  Byte secondByte;
};
 
 
Foo foo;
Foo& refFoo = foo;
Foo* ptrFoo = foo;
 
foo.secondByte = 1;
// foo находится в памяти по адресу A. Чтобы такая запись выполнялась, компилятор
// берет адрес A прибавляет к нему один байт и записывает по этому адресу еденицу
// (secondByte смещено относительно A на один байт, потому что перед этой ячейкой памяти есть
// один байт под поле firstByte).
 
// Теперь через указатель:
ptrFoo->secondByte = 1; // тут то же самое происходит.
 
// С ссылкой опять та же история
refFoo.secondByte = 1; // тут то же самое происходит.
Т.е. везде во время компиляции определяется смещение, а во время выполнения к адресу объекта
прибавляется это смещение и по получившемуся адресу записывается еденица.
Так вот для комплятора что стрелка, что точка - один хрен. Во всех случаях компилятор
знает, что нужно смещение и это смещение для всех случаев одно и то же.
Такое разделичие в синтаксисе ввели скорее всего чтобы в коде было видно, что есть объект,
а что есть указатель на объект. А может и просто так, не подумав. Такие случаи тоже бывают. Ну а с++ унаследовал такой синтаксис.
 
Текущее время: 07:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru