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

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

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

Author24 — интернет-сервис помощи студентам
Только изучаю С++ (раньше довольно неплохо программил на Делфи) и столкнулся с вопросом.
Допустим есть две структуры:
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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; ...

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

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

50
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
04.06.2013, 16:20 2
На счет первого куска
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  [ТС] 3
Цитата Сообщение от 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 4
-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  [ТС] 5
А насчёт DWORD(p)+i ? Иначе говоря адрес структуры сместится на I байт?
Я правильно понял?
0
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
04.06.2013, 17:09 6
На счет DWORD(p)+i затрудняюсь сказать, потому что преобразование будет даже не в указатель
Указатель - тоже число, но суть у него другая.
чтобы на i байт смещать, надо указатель к указателю на байты и преобразовывать (char*)
как в предыдущем посте

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

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

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

Насколько я понял
C++
1
p.Fr = p[-1].Fr;
нельзя написать только потому, что заругается компилятор, но суть одна и та же.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
04.06.2013, 23:42 14
Цитата Сообщение от 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  [ТС] 15
А -> это ещё и оператор? Я смотрю, везде, где в дельфи стоит точка, в С++ стоит ->. А теперь оказывается это оператор...

С указателем вообще тогда не понял. Символ * в С++ разве не означает указатель? Разве *(Char) в С++ не эквивалентно PChar на Делфи? PChar это ведь указатель на строку...
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
04.06.2013, 23:59 16
Цитата Сообщение от 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  [ТС] 17
Цитата Сообщение от alsav22 Посмотреть сообщение
Имя массива это тоже указатель (адрес начала массива). Поэтому, в данном случае, разницы между указателем на массив и именем массива нет. И в первом случае, и во втором можно обращаться к элементам массива по индексу.
А разве в моём примере P - это массив? Мне кажется это структура или указатель на структуру, но никак не массив. У массива вроде размер должен быть... Хотя в Делфи тоже есть безразмерные (неопределённые) массивы...
В общем, хотел разобраться, а теперь ещё больше запутался
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 00:05 18
Цитата Сообщение от fominov Посмотреть сообщение
Мне кажется это структура или указатель на структуру, но никак не массив.
Откуда знаете, что не массив?
Цитата Сообщение от fominov Посмотреть сообщение
А разве в моём примере P - это массив?
А вы разве показали код?
0
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 00:05  [ТС] 19
Цитата Сообщение от alsav22 Посмотреть сообщение
А так получают содержимое этого указателя (значение переменной на которую он указывает), в данном случае * - это операция разыменования:
C++
1
int b = *p;
Вот! Отличный пример.

Так, а если написано
C++
1
int b = p[0];
Что это тогда мы получим?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 00:32 20
Цитата Сообщение от 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
05.06.2013, 00:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2013, 00:32
Помогаю со студенческими работами здесь

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

Работа со структурами
Почему-то после того как я ввожу количество студентов программа сама завершается с кодом 0. ...

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

Работа со структурами
Помогите написать программу подобного рода: Работа со структурами. Программа должна содержать...

Работа со структурами
Создать массив структур Название файла, объем файла, дата создания. И вывести на печать записи...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru