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

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

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

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

04.06.2013, 15:56. Просмотров 1820. Ответов 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++
Цель работы: научиться объявлять структуру и работать с ее по-лями Помогите пожалуйста. Нужно вот такую программку написать. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5419 / 4815 / 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;
1
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 00:01  [ТС] #17
Цитата Сообщение от alsav22 Посмотреть сообщение
Имя массива это тоже указатель (адрес начала массива). Поэтому, в данном случае, разницы между указателем на массив и именем массива нет. И в первом случае, и во втором можно обращаться к элементам массива по индексу.
А разве в моём примере P - это массив? Мне кажется это структура или указатель на структуру, но никак не массив. У массива вроде размер должен быть... Хотя в Делфи тоже есть безразмерные (неопределённые) массивы...
В общем, хотел разобраться, а теперь ещё больше запутался
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 00:05 #18
Цитата Сообщение от fominov Посмотреть сообщение
Мне кажется это структура или указатель на структуру, но никак не массив.
Откуда знаете, что не массив?
Цитата Сообщение от fominov Посмотреть сообщение
А разве в моём примере P - это массив?
А вы разве показали код?
0
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];
Что это тогда мы получим?
0
alsav22
5419 / 4815 / 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.
1
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 00:46  [ТС] #21
Цитата Сообщение от alsav22 Посмотреть сообщение
В общем случае, если p - это адрес (указатель или имя массива), то p[i] - содержимое по этому адресу со смещением i.
Вот я так и думал. Но тогда давайте ещё раз проясним на моём примере. Итак есть указатель *р на структуру ABC_CONT_STATE. Получается p[0] - это грубо говоря указатель на параметр Symb этой структуры, а р[1] - это грубо говоря указатель на параметр Fr.

Правильно я понял?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 01:15 #22
Цитата Сообщение от fominov Посмотреть сообщение
Правильно я понял?
Нет. Грубо говоря, указатель - это адрес. Есть указатель на структуру ABC_CONT_STATE - p (адрес в памяти). Что в этой памяти из кода не видно. Может быть всё что угодно, но указатель будет вести себя, как указатель на структуру ABC_CONT_STATE. Т.е., если сделать ++p, то арес p станет больше на размер структуры ABC_CONT_STATE.
Цитата Сообщение от fominov Посмотреть сообщение
Получается p[0] - это грубо говоря указатель на параметр Symb этой структуры, а р[1] - это грубо говоря указатель на параметр Fr.
Цитата Сообщение от alsav22 Посмотреть сообщение
В общем случае, если p - это адрес (указатель или имя массива), то p[i] - содержимое по этому адресу со смещением i.
Так как указатель p - это указатель на структуру, то смещение i будет равно размеру структуры. Тогда: p[0] - содержимое по адресу p cо смещением 0, р[1] - содержимое по адресу p cо смещением 1 (по адресу p + размер структуры в байтах).

Добавлено через 5 минут
Если p - это адрес начала массива структур, то p[0] - это первая структура, p[1] - вторая и т.д.

Добавлено через 5 минут
p[0].Symb - поле Symb первой структуры, p[0].Fr - поле Fr первой структуры, p[1].Symb - поле Symb второй структуры, p[1].Fr - поле Fr второй структуры,
1
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 10:06  [ТС] #23
Спасибо. Очень толково разжёванный ответ. Вы мне очень помогли.
Мне теперь осталось разобраться с р[-1], но тут наверное чисто опытным путём. Интересно, на Делфи это как бы выглядело...?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 10:37 #24
Цитата Сообщение от fominov Посмотреть сообщение
Мне теперь осталось разобраться с р[-1]
Цитата Сообщение от fominov Посмотреть сообщение
а это готовый код из одного алгоритма шифрования. И он работает
Разобраться как работает код? При таком обращении (p[-1]) важно знать, что в памяти находится перед структурой ABC_CONT_STATE, не думаю, что для алгоритма шифрования, всё равно, что там лежит. Перед объявлением ABC_CONT_STATE ещё что-то объявлялось?
0
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 11:34  [ТС] #25
Цитата Сообщение от alsav22 Посмотреть сообщение
Перед объявлением ABC_CONT_STATE ещё что-то объявлялось?
Разве что директива #pragma pack(1)
А в функции переменная определена так:

C++
1
2
3
4
void ABC_CONT_res(struct ABC_CONT *curr)
{
    UINT OldNU, Adder, EscFreq, i=curr->NumStat;
    struct ABC_CONT_STATE tmp, * p1, * p;
А потом идёт условный переход:
C++
1
2
if (p[0].Freq > p[-1].Freq)
        {...}
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 11:58 #26
Из этих кусков ничего не понять. Вот здесь:
C++
1
2
3
...
struct ABC_CONT_STATE tmp, *p1, *p;
...
объявлены структура и два указателя на структуру, но указатели не привязаны ни к каким адресам (в них мусор). Дальше с ними какие-то действия:
C++
1
2
...if (p[0].Freq > p[-1].Freq)
...
Чего-то явно не хватает.
0
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 12:38  [ТС] #27
Цитата Сообщение от alsav22 Посмотреть сообщение
объявлены структура и два указателя на структуру, но указатели не привязаны ни к каким адресам (в них мусор).
Привязка это я так понимаю следующий код:

C++
1
2
3
4
5
p1=curr;
...
(p=pc->Stat)->Symb;
{...}
p++;
и потом, то, что я уже писал:
C++
1
if (p[0].Fr >= p[-1].Fr)
{
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 12:51 #28
Цитата Сообщение от fominov Посмотреть сообщение
(p=pc->Stat)->Symb;
pc?
0
fominov
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 24
05.06.2013, 13:00  [ТС] #29
Цитата Сообщение от alsav22 Посмотреть сообщение
pc?
Нет, ошибка.

C++
1
(p=р1->Stat)->Symb;
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 13:13 #30
Тогда нужно знать с каким адресом связан указатель Stat в структуре, которая передаётся в функцию. Странный код. Откуда взяли? Вот эту строку:
C++
1
(p=р1->Stat)->Symb;
можно записать так:
C++
1
p=р1->Stat;
и будет то же самое. Вопрос из первого поста:

Цитата Сообщение от fominov Посмотреть сообщение
И заодно непонятно, что означает инкремент этой переменной:
C++
1
(++p)->Fr; // увеличение на единицу элемента Fr?
Это можно записать так:
C++
1
++p;
То же самое. Зачем здесь добавляется доступ к полям, с которыми потом ничего не делается, непонятно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2013, 13:13
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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