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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
michurinnn
15 / 15 / 1
Регистрация: 02.12.2010
Сообщений: 48
#1

Инкремент указателя - C++

25.12.2010, 03:31. Просмотров 2378. Ответов 3
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
using namespace std;
class Student
{
    public:
    Student(){A=B=C=2;}
    int getA(){return A;}
    private:
    int A,B,C;
};
int main()
{
    Student* arr0[10];
    for ( int i = 0; i<10; i++)
    {
        arr0[i] = new Student;
        cout<<arr0[i]<<endl;
    }
 
    Student* tmp = arr0[0];
 
    cout<<tmp<<endl;
    cout<<tmp->getA()<<endl;
 
    tmp++;
    cout<<tmp<<endl;
    cout<<tmp->getA()<<endl;
 
    tmp++;
    cout<<tmp<<endl;
    cout<<tmp->getA()<<endl;
 
    cout<<sizeof(Student)<<endl;
}
На выходе получаю:
----------------------
0xa41240
0xa41258
0xa41270
0xa41288
0xa412a0
0xa412b8
0xa412d0
0xa412e8
0xa41300
0xa41318

0xa41240
2
0xa4124c
54408397
0xa41258
2
12
------------------
Т.о., размер объекта класса Student == 12 байт ( 3 по int)
Инкрементируюя tmp, указатель перемещается на 12 байт.
Но при создании массива каждый элемент расположен через 24 байта.

Поделитесь знаниями, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2010, 03:31     Инкремент указателя
Посмотрите здесь:

Инкремент указателя на указатель - C++
Добрый день!!! Ребят, подскажите пожалуста, как выполнить инкремент указателя на указатель. Программа аварийно завершается. Я так понимаю,...

Инкремент ссылки - C++
int arr = {....} ; while(arr) // arr ссылка на начало массива то есть на 0 элемент ; { //тело цикла ++arr ;//инкремент } ...

Инкремент в произведении - C++
Друзья, на ерунде запнулся, допустим: n = 2000; тогда в какой последовательности нужно решать вот это выражение: --n*n*n = ? ...

Инкремент переменной - C++
в задании сказано, что пользователь вводит строку и программа выводит ее, но если пользователь вводит еще и цифру, то программа должна...

Не работает инкремент - C++
repeat: if(e&lt;=mode){ cout &lt;&lt; &quot;\nИгрок №&quot; &lt;&lt; e &lt;&lt; a &lt;&lt; endl; cin &gt;&gt; sim &gt;&gt; b;//записываем в строку для...

Инкремент и преинкремент - C++
Здравствуйте. Я вот решил протестить в чем разница между инкрементом и преинкрементом, и как-то не увидел разницы... В чем же разница? :) ...

Инкремент(Декремент) - C++
Есть ли разница,какую употреблять форму:префиксную или постфиксную? Если на экран выводится одно и то же число в префиксной и постфиксной...

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

постфиксный инкремент - C++
class Inkrement { Inkrement(){}; Inkrement &amp;operator++(int) { Inkrement temp = *this; ++*this; return temp; ...

Инкремент и передача параметров - C++
Недавно наткнулся на человека, который утверждал что: int add(int x, y) { return x+y; } int func() { int i = 1; return...

Инкремент byte и увеличение на 2 - C++
Добрый день. Есть массив BYTE Counter = { 0x00, 0x00, 0x00, 0x01 }; Мне необходимо инкрементировать последний элемент. Я пишу. ...

Инкремент билда в VS 2008 C++ - C++
Подскажите хоть какое нибудь работающее решение для инкремента билда в VS 2008 для С++


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
25.12.2010, 03:57     Инкремент указателя #2
Вы сдвигаете на размер указателя.
Вот так более очевидный результат?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
using namespace std;
class Student {
    public:
    Student(){A=B=C=2;}
    int getA(){return A;}
    private:
    int A,B,C;
};
 
int main() {
  Student arr0[10];
 
/*
  for ( int i = 0; i<10; i++) {
    arr0[i] = new Student;
    cout<<arr0[i]<<endl;
  }
*/
 
  Student* tmp = &arr0[0];
 
  cout<<tmp<<endl;
  cout<<tmp->getA()<<endl;
 
  tmp++;
  cout<<tmp<<endl;
  cout<<tmp->getA()<<endl;
 
  tmp++;
  cout<<tmp<<endl;
  cout<<tmp->getA()<<endl;
 
  cout<<sizeof(Student)<<endl;
  
  int key;
  cin >> key;
}
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.12.2010, 05:49     Инкремент указателя #3
Цитата Сообщение от michurinnn
Но при создании массива каждый элемент расположен через 24 байта.
потому что память выделяется не столько, сколько запрашиваешь, а ещё там дополнительная информация о блоке

в C malloc() слева от возвращаемого блока хранит информацию о его размере, но сам блок может быть также больше и с правой стороны (небольшие количества байт занимают один крупный фрагмент)
поэтому тебе возвращается память, которая гарантированно может хранить столько, сколько ты запрашивал
а вот эта инфа, она уже нужна, чтобы free правильно выполнялась, delete в C++
потому что память после освобождения опять помечается доступной для использования
michurinnn
15 / 15 / 1
Регистрация: 02.12.2010
Сообщений: 48
25.12.2010, 06:37  [ТС]     Инкремент указателя #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;
class Student
{
    public:
    Student(){A=B=C=2;}
    int getA(){return A;}
    private:
    int A,B,C;
};
int main()
{
    Student* arr0[10];
    Student** tmp = arr0;
    for ( int i = 0; i<10; i++)
    {
        arr0[i] = new Student;
        cout<<"arr0 "<<&arr0[i]<<"  "<<arr0<<endl;
    }
 
    cout<<tmp<<endl;
    cout<<(*tmp)->getA()<<endl;
 
    tmp++;
    cout<<tmp<<endl;
    cout<<(*tmp)->getA()<<endl;
 
    tmp++;
    cout<<tmp<<endl;
    cout<<(*tmp)->getA()<<endl;
}
Может пригодится кому-нибудь...

Добавлено через 29 минут
И чтобы освободить память:
C++
1
2
3
4
5
6
    for ( int i = 0;i<10;i++)
    {
        delete arr0[i];
        arr0[i] = NULL;
    }
    tmp = NULL;
Yandex
Объявления
25.12.2010, 06:37     Инкремент указателя
Ответ Создать тему
Опции темы

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