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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
#1

Работа со структурами - C++

04.06.2013, 15:56. Просмотров 1821. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2013, 15:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа со структурами (C++):

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

Работа со структурами - C++
Имеется вот такая задача: Файл, содержащий даты. Каждая дата - это структура, помещенная в отдельную запись. Состав структуры: ...

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

Работа со структурами - C++
Известны данные о численности населения и площади 10 государств. Определить государство с максимальной плотностью населения. P.S. ...

Работа со структурами. - C++
Здраствуйте! Текст задания : Создать программу, позволяющую вводить элементы массива структур (размерность массива не более 20...

Работа со структурами - C++
Цель работы: научиться объявлять структуру и работать с ее по-лями Помогите пожалуйста. Нужно вот такую программку написать. ...

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

Хотя если сделать так (char*)((DWORD)(p)+i), то видимо будет сдвиг на i байт, либо не к char* приводить, а к чему-то другому, суть в том, что тут получается преобразование в число, т.е. просто адрес памяти берется, этот адрес увеличивается, а потом обратно в указатель преобразуется
Но это извращение какое-то
1
fominov
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
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.06.2013, 23:18 #8
Цитата Сообщение от fominov Посмотреть сообщение
если можно просто написать
C++
1
p.Fr = p[-1].Fr;
Попробуйте и посмотрите, что скажет компилятор.

Добавлено через 2 минуты
Чтобы так написать, p должна быть структурой, а это указатель на структуру.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
04.06.2013, 23:20 #9
Цитата Сообщение от Kojt Посмотреть сообщение
p - указатель на память, если указать сдвиг -1, то обратится ХЗ куда, не надо так делать
Глупости. Если программист знает, что делает. Если p указывает на элемент некоего массива структур и этот элемент не первый, то почему бы не обратиться к p[-1]?
Тем более, что записи p[i] и *(p+i) в большинстве случаев равносильны
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.06.2013, 23:21 #10
Цитата Сообщение от alsav22 Посмотреть сообщение
если можно просто написать
Вот так можно:
C++
1
(*p).Fr = p[-1].Fr;
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
04.06.2013, 23:23 #11
Цитата Сообщение от fominov Посмотреть сообщение
p.Fr = p[-1].Fr;
ты правда не понимаешь разницу между p и *p
между p[i].Fr и p->Fr
правда?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.06.2013, 23:24 #12
p[0] - содержимое (т.е. струкура) по адресу p со смещением 0, тоже что *p.
0
fominov
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
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
04.06.2013, 23:42 #14
Цитата Сообщение от fominov Посмотреть сообщение
Разницу Р и *Р я вроде понимаю. Первое - это структура, набор данных. Второе - это указатель адреса памяти, где она в данный момент хранится (грубо говоря). Я прав?
нет, наоборот. *p это структура, а p - указатель на неё.
(Если конечно объявлено было struct ABC_CONT_STATE * p; с последующим присвоением указателю адреса структуры)
Цитата Сообщение от fominov Посмотреть сообщение
А вот разницу между p[i].Fr и p->Fr, я, если честно, уже не понимаю.
ты оператор -> проходил?
0
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
04.06.2013, 23:47  [ТС] #15
А -> это ещё и оператор? Я смотрю, везде, где в дельфи стоит точка, в С++ стоит ->. А теперь оказывается это оператор...

С указателем вообще тогда не понял. Символ * в С++ разве не означает указатель? Разве *(Char) в С++ не эквивалентно PChar на Делфи? PChar это ведь указатель на строку...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2013, 23:47
Привет! Вот еще темы с ответами:

Работа со структурами - C++
Сегодня преподаватель огорошил известием что к завтрашнему дню надо сдать лабораторную по Работе со структурами. Было бы хорошо. НО он...

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

Работа со структурами - C++
Ввести в компьютер информацию о сотрудниках : фамилия,имя,возраст. Напечатать имена сотрудников,у которых возраст больше 28 лет

работа со структурами - C++
#include<conio.h> #include<iostream.h> #include<string.h> main() { int n=0, i, zapros, flag=0; char s; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.06.2013, 23:47
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru