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

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

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

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

04.06.2013, 15:56. Просмотров 1729. Ответов 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++; // А тут что увеличивается на единицу, все элементы?
Заранее всем спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2013, 15:56     Работа со структурами
Посмотрите здесь:

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

Работа со структурами - C++
Подскажите почему ничего не выводится? Когда жму CTRL-F5 выдаёт что есть ошибки, хотя в коде ничего не подсвечивается. #include...

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

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

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

Работа со структурами - C++
#include<iostream.h> #include<math.h> struct List { float fi,r,z; int n; }; void vvod (List &, int); void vivod (List...

Работа со структурами - C++
#include<iostream.h> #include<math.h> struct List { float fi,r,z; int n; }; void vvod...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 - указатель, он и смещается на один блок в байтах равный размеру структуры
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);
}
Я правильно понимаю?
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))
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
04.06.2013, 17:05  [ТС]     Работа со структурами #5
А насчёт DWORD(p)+i ? Иначе говоря адрес структуры сместится на I байт?
Я правильно понял?
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* приводить, а к чему-то другому, суть в том, что тут получается преобразование в число, т.е. просто адрес памяти берется, этот адрес увеличивается, а потом обратно в указатель преобразуется
Но это извращение какое-то
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;
Может я что-то не так понял, учитель?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.06.2013, 23:18     Работа со структурами #8
Цитата Сообщение от fominov Посмотреть сообщение
если можно просто написать
C++
1
p.Fr = p[-1].Fr;
Попробуйте и посмотрите, что скажет компилятор.

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

С указателем вообще тогда не понял. Символ * в С++ разве не означает указатель? Разве *(Char) в С++ не эквивалентно PChar на Делфи? PChar это ведь указатель на строку...
alsav22
5416 / 4812 / 442
Регистрация: 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;
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 00:01  [ТС]     Работа со структурами #17
Цитата Сообщение от alsav22 Посмотреть сообщение
Имя массива это тоже указатель (адрес начала массива). Поэтому, в данном случае, разницы между указателем на массив и именем массива нет. И в первом случае, и во втором можно обращаться к элементам массива по индексу.
А разве в моём примере P - это массив? Мне кажется это структура или указатель на структуру, но никак не массив. У массива вроде размер должен быть... Хотя в Делфи тоже есть безразмерные (неопределённые) массивы...
В общем, хотел разобраться, а теперь ещё больше запутался
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 00:05     Работа со структурами #18
Цитата Сообщение от fominov Посмотреть сообщение
Мне кажется это структура или указатель на структуру, но никак не массив.
Откуда знаете, что не массив?
Цитата Сообщение от fominov Посмотреть сообщение
А разве в моём примере P - это массив?
А вы разве показали код?
fominov
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];
Что это тогда мы получим?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2013, 00:32     Работа со структурами
Еще ссылки по теме:

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

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

РАБОТА СО СТРУКТУРАМИ - C++
Судоходные реки: Название реки, протяженность, минимальная глубина фарватера. Дополнить вывод информацией о том, подходит ли река для...

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

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


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 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.
Yandex
Объявления
05.06.2013, 00:32     Работа со структурами
Ответ Создать тему
Опции темы

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