Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/19: Рейтинг темы: голосов - 19, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24

Работа со структурами

04.06.2013, 15:56. Показов 4617. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Только изучаю С++ (раньше довольно неплохо программил на Делфи) и столкнулся с вопросом.
Допустим есть две структуры:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct ABC_CONT_STATE
    {                          
        BYTE Symb, Fr;                  
        struct ABC_CONT* Successor;
    } _PACK_ATTR;                   
 
 
static struct ABC_CONT
{                 
    BYTE NmStat, Flag;                   
    WORD SummFreq;                         
    struct ABC_CONT_STATE *Stat;
    struct ABC_CONT* Sufix;                    
} _PACK_ATTR* MaxContext;
 
struct ABC_CONT_STATE * p;
Что означает следующее обращение к переменной "р":

C++
1
p[0].Fr = p[-1].Fr;
И заодно непонятно, что означает инкремент этой переменной:

C++
1
(++p)->Fr; // увеличение на единицу элемента Fr?
или

C++
1
p++; // А тут что увеличивается на единицу, все элементы?
Заранее всем спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.06.2013, 15:56
Ответы с готовыми решениями:

Работа со структурами
struct data_type { int day; int month; int year; }data_birthday; /*нужна ли здесь эта переменная или достаточно вызвать...

Работа с структурами
#include <cstdlib> #include <iostream> using namespace std; struct struc{ char* a; int x; }

Работа со структурами
Всем доброго времени суток! Имеется следующая задача: Написал следующий код: #include <iostream> #include...

50
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
04.06.2013, 16:20
На счет первого куска
p - указатель на память, если указать сдвиг -1, то обратится ХЗ куда, не надо так делать (точнее не следует так делать пока не разобрался что к чему)
запись p[i] эквивалентна записи *(p+i)

C++
1
(++p)->Fr; // сдвиг указателя и обращение к полю Fr
C++
1
p++; // Переменная p - указатель, он и смещается на один блок в байтах равный размеру структуры
0
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
04.06.2013, 16:48  [ТС]
Цитата Сообщение от Kojt Посмотреть сообщение
На счет первого куска
p - указатель на память, если указать сдвиг -1, то обратится ХЗ куда, не надо так делать (точнее не следует так делать пока не разобрался что к чему)
Так в том то и дело, что это не я так делаю, а этого готовый код из одного алгоритма шифрования. И он работает, а вот как, я не пойму... И после Вашего объяснения всё равно не понял...

Цитата Сообщение от Kojt Посмотреть сообщение
запись p[i] эквивалентна записи *(p+i)
Т.е. если адрес структуры представить в виде DWORD, то вышеописанная операция будет выглядеть так:
DWORD(p)+i ? Иначе говоря адрес структуры сместится на I байт?

Цитата Сообщение от Kojt Посмотреть сообщение
C++
1
p++; // Переменная p - указатель, он и смещается на один блок в байтах равный размеру структуры
Опять же, если перевести адрес в DWORD, то p++ буде буде выглядеть так:
C++
1
2
3
4
struct Dword Addr;
{
Addr=DWORD(p)+SizeOf(p);
}
Я правильно понимаю?
0
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
04.06.2013, 16:56
-1 будет работать в том случае, когда "p" некий позиционный указатель
т.е. если мы где-то выделили память, потом p переместили куда-то в середину выделенного блока, а потом пытаемся по смещению -1 обратиться.

поскольку p - указатель, то sizeof(p) = разрядности платформы вне зависимости от того, на что указывает этот указатель.
А запись p++ будет эквивалентна записи
p = (ABC_CONT_STATE*)((char*)p + sizeof(ABC_CONT_STATE))
1
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
04.06.2013, 17:05  [ТС]
А насчёт DWORD(p)+i ? Иначе говоря адрес структуры сместится на I байт?
Я правильно понял?
0
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
04.06.2013, 17:09
На счет DWORD(p)+i затрудняюсь сказать, потому что преобразование будет даже не в указатель
Указатель - тоже число, но суть у него другая.
чтобы на i байт смещать, надо указатель к указателю на байты и преобразовывать (char*)
как в предыдущем посте

Хотя если сделать так (char*)((DWORD)(p)+i), то видимо будет сдвиг на i байт, либо не к char* приводить, а к чему-то другому, суть в том, что тут получается преобразование в число, т.е. просто адрес памяти берется, этот адрес увеличивается, а потом обратно в указатель преобразуется
Но это извращение какое-то
1
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
04.06.2013, 23:06  [ТС]
Цитата Сообщение от Kojt Посмотреть сообщение
запись p[i] эквивалентна записи *(p+i)
Думал я, думал, и усомнился. Если всё так как Вы говорите, то зачем нужна конструкция
C++
1
p[0].Fr = p[-1].Fr;
, если можно просто написать
C++
1
p.Fr = p[-1].Fr;
Может я что-то не так понял, учитель?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
04.06.2013, 23:18
Цитата Сообщение от fominov Посмотреть сообщение
если можно просто написать
C++
1
p.Fr = p[-1].Fr;
Попробуйте и посмотрите, что скажет компилятор.

Добавлено через 2 минуты
Чтобы так написать, p должна быть структурой, а это указатель на структуру.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
04.06.2013, 23:20
Цитата Сообщение от Kojt Посмотреть сообщение
p - указатель на память, если указать сдвиг -1, то обратится ХЗ куда, не надо так делать
Глупости. Если программист знает, что делает. Если p указывает на элемент некоего массива структур и этот элемент не первый, то почему бы не обратиться к p[-1]?
Тем более, что записи p[i] и *(p+i) в большинстве случаев равносильны
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
04.06.2013, 23:21
Цитата Сообщение от alsav22 Посмотреть сообщение
если можно просто написать
Вот так можно:
C++
1
(*p).Fr = p[-1].Fr;
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
04.06.2013, 23:23
Цитата Сообщение от fominov Посмотреть сообщение
p.Fr = p[-1].Fr;
ты правда не понимаешь разницу между p и *p
между p[i].Fr и p->Fr
правда?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
04.06.2013, 23:24
p[0] - содержимое (т.е. струкура) по адресу p со смещением 0, тоже что *p.
0
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
04.06.2013, 23:37  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ты правда не понимаешь разницу между p и *p
между p[i].Fr и p->Fr
правда?
Разницу Р и *Р я вроде понимаю. Первое - это структура, набор данных. Второе - это указатель адреса памяти, где она в данный момент хранится (грубо говоря). Я прав?

А вот разницу между p[i].Fr и p->Fr, я, если честно, уже не понимаю. Если бы эта конструкция была на делфи, то понятно, что p[i] - это некий элемент массива. А вот в С++ понять не могу. Это ведь указатель, а не массив, как к нему можно обращаться через элемент [І]?

Насколько я понял
C++
1
p.Fr = p[-1].Fr;
нельзя написать только потому, что заругается компилятор, но суть одна и та же.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
04.06.2013, 23:42
Цитата Сообщение от fominov Посмотреть сообщение
Разницу Р и *Р я вроде понимаю. Первое - это структура, набор данных. Второе - это указатель адреса памяти, где она в данный момент хранится (грубо говоря). Я прав?
нет, наоборот. *p это структура, а p - указатель на неё.
(Если конечно объявлено было struct ABC_CONT_STATE * p; с последующим присвоением указателю адреса структуры)
Цитата Сообщение от fominov Посмотреть сообщение
А вот разницу между p[i].Fr и p->Fr, я, если честно, уже не понимаю.
ты оператор -> проходил?
0
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
04.06.2013, 23:47  [ТС]
А -> это ещё и оператор? Я смотрю, везде, где в дельфи стоит точка, в С++ стоит ->. А теперь оказывается это оператор...

С указателем вообще тогда не понял. Символ * в С++ разве не означает указатель? Разве *(Char) в С++ не эквивалентно PChar на Делфи? PChar это ведь указатель на строку...
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
04.06.2013, 23:59
Цитата Сообщение от fominov Посмотреть сообщение
нельзя написать только потому, что заругается компилятор
Не только. Потому что неправильно (даже если бы компилятор и не ругался).

Добавлено через 3 минуты
Цитата Сообщение от fominov Посмотреть сообщение
Если бы эта конструкция была на делфи, то понятно, что p[i] - это некий элемент массива. А вот в С++ понять не могу. Это ведь указатель, а не массив, как к нему можно обращаться через элемент [І]?
Имя массива это тоже указатель (адрес начала массива). Поэтому, в данном случае, разницы между указателем на массив и именем массива нет. И в первом случае, и во втором можно обращаться к элементам массива по индексу.

Добавлено через 3 минуты
Цитата Сообщение от fominov Посмотреть сообщение
Символ * в С++ разве не означает указатель?
В разных случаях обозначает разное (даже умножение).

Добавлено через 4 минуты
Так объявляется указатель на int, * показывает, что p - это указатель:
C++
1
2
3
int *p;
int a;
p = &a
А так получают содержимое этого указателя (значение переменной на которую он указывает), в данном случае * - это операция разыменования:
C++
1
int b = *p;
1
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 00:01  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Имя массива это тоже указатель (адрес начала массива). Поэтому, в данном случае, разницы между указателем на массив и именем массива нет. И в первом случае, и во втором можно обращаться к элементам массива по индексу.
А разве в моём примере P - это массив? Мне кажется это структура или указатель на структуру, но никак не массив. У массива вроде размер должен быть... Хотя в Делфи тоже есть безразмерные (неопределённые) массивы...
В общем, хотел разобраться, а теперь ещё больше запутался
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 00:05
Цитата Сообщение от fominov Посмотреть сообщение
Мне кажется это структура или указатель на структуру, но никак не массив.
Откуда знаете, что не массив?
Цитата Сообщение от fominov Посмотреть сообщение
А разве в моём примере P - это массив?
А вы разве показали код?
0
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 00:05  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
А так получают содержимое этого указателя (значение переменной на которую он указывает), в данном случае * - это операция разыменования:
C++
1
int b = *p;
Вот! Отличный пример.

Так, а если написано
C++
1
int b = p[0];
Что это тогда мы получим?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 00:32
Цитата Сообщение от fominov Посмотреть сообщение
Что это тогда мы получим?
Тоже самое.

Добавлено через 56 секунд
К указателям и массивам:
C++
1
2
3
4
5
6
7
8
9
int arr[3] = {1, 2, 3};
 
 cout << *arr << ' ' << *(arr + 1) << ' ' << *(arr + 2) << endl;
 cout << arr[0] << ' ' << arr[1] << ' ' << arr[2] << endl;
 
 int *p = arr;
 
 cout << *p << ' ' << *(p + 1) << ' ' << *(p + 2) << endl;
 cout << p[0] << ' ' << p[1] << ' ' << p[2] << endl;
Одно и тоже.

Добавлено через 14 минут
Цитата Сообщение от fominov Посмотреть сообщение
Так, а если написано
C++
1
int b = p[0];
Что это тогда мы получим?
В общем случае, если p - это адрес (указатель или имя массива), то p[i] - содержимое по этому адресу со смещением i.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.06.2013, 00:32
Помогаю со студенческими работами здесь

Работа со структурами
У меня есть структура, содержащая фамилии учеников и их оценки по 3 предметам. Как мне посчитать средний балл каждого студента и вывести...

Работа со структурами
вот такая задача: Распечатать список учеников музыкальной школы, которые учатся играть на скрипке. Указать сколько лет они занимаются...

Работа со структурами
Почему-то после того как я ввожу количество студентов программа сама завершается с кодом 0. #include &quot;stdafx.h&quot; ...

Работа со структурами
Организовать файл с указанной структурой в задании 1. Осуществить просмотр данных файла, которые соответствуют критериям отбора...

Работа со структурами
Помогите написать программу подобного рода: Работа со структурами. Программа должна содержать функции, необходимые для выполнения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru