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

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

Войти
Регистрация
Восстановить пароль
 
Aliru777
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
#1

Адрессация в 2-х мерных динамических массивах и nullptr - C++

01.09.2012, 22:22. Просмотров 725. Ответов 11
Метки нет (Все метки)

Сегодня читал стаью о памяти,указателях итп
Написал программу для динамического 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
39
40
41
42
43
44
45
46
47
48
// what is array.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "iostream"
#include <conio.h>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int *p=new int[4];
    cout<<p<<endl;
    cout<<&p<<endl;
    cout<<&p[0]<<endl;
    int y[9]={1,2,3,4,5,6,7,8,9};
    cout<<y<<endl<<&y<<endl<<&y[0]<<endl;
    int a,b;
    cout<<"Enter a & b\n";
    cin>>a;
    int **p1=new int*[a];
    cin>>b;
    for(int i=0; i<a; i++)
{
   p1[i] = new int [b];
}
    for (int i=0; i<a; i++)
        for (int j=0;j<b; j++)
            cin>>p1[i][j];
    for (int i=0; i<a; i++)
    {
        for (int j=0;j<b; j++)
            cout<<p1[i][j]<<"\t";
        cout<<endl;
    }
    cout<<(p1[a-1])<<"\t"<<&p1[0][0]<<endl;
    cout<<(&p1[1][1]-&p1[1][0])<<endl;
    cout<<(&p1[1][1]-&p1[0][1])<<endl;
    cout<<(&p1[1][1]-&p1[0][0]);
    getch();
    for(int i=0; i<a; i++)
   {
       delete[] p1[i];
   }
    delete []p;
    delete []p1;
    return 0;
}
Вопрос почему разница между адрессом p1[1][1] и p1[0][1] 18(у меня) - те я думал что они должны идти друг за другом, как [1][0] и [1][1] где разница в 1(ну или 4 байта)?
Еще вопрос - еще не осилил Ван ден Линдена, но обычный массив в мрем случае "у" имеет один и тот же адресс 00С допустим
C++
1
2
int y[9]={1,2,3,4,5,6,7,8,9};
    cout<<y<<endl<<&y<<endl<<&y[0]<<endl;
Это так описано в компиляторе?
И последний вопрос у меня при строка int *Y=nullptr; вызывает ошибку С2065 - но может это связано с вижуал студио 2005?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2012, 22:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Адрессация в 2-х мерных динамических массивах и nullptr (C++):

О динамических массивах и константах - C++
Чуток подзабыл я эту тему, а уточнить надо. Как известно, у каждой функции создаётся стек, размер которого должен быть чётко определён....

Вывод неповторяющихся элементов в динамических массивах - C++
Помогите с заданием 5 (перевод для не любителей украинского Напишите программу, которая вводит с клавиатуры два непустых...

nullptr в codeblocks - C++
Поддерживается ли? Как подключить?

G++ не распознает nullptr - C++
Компилятор gcc4.5 флаг -std=gnu++0x но не распознает nullptr почему то Build Prog_name -fmessage-length=0 -std=gnu++0x -fPIC...

Проверка на nullptr + разыменовывание - C++
Как-то я упустил этот вопрос ранее, может и туплю, но можно ли в одном условии проверять указатель и разыменовывать его? Data* data =...

Отлов обращения по nullptr - C++
Добрый вечер, можно ли в крупной программе организовать систему отлова обращения по указателю nullptr ? Очень интересует вариант...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrCold
855 / 753 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
01.09.2012, 23:19 #2
2) имя массива еще и является адресом, по которому в памяти находится первый элемент массива.
3) nullptr - c++ 11
1) p1[1][1] и p1[0][1] - у вас разница между э-ми в целую строку массива .

если друг за другом то разница 2-4 байта - от компилятора зависит.
1
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
01.09.2012, 23:25 #3
Цитата Сообщение от MrCold Посмотреть сообщение
от компилятора зависит
От системы а не компилятора. В 32-битных системах указатель равен 4 байте, 64 - 8 байт.
1
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 23:29 #4
Цитата Сообщение от Aliru777 Посмотреть сообщение
Вопрос почему разница между адрессом p1[1][1] и p1[0][1] 18(у меня) - те я думал что они должны идти друг за другом, как [1][0] и [1][1]
Почему это они должны идти друг за другом? о_О
0
Aliru777
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
01.09.2012, 23:34  [ТС] #5
2) это и так понятно.вопрос был почему это выводит один и тот же адресс
C++
1
cout<<y<<endl<<&y<<endl<<&y[0]<<endl;
особенно здесь у==&y?Те он то что он хранит и то где он находится есть одно и тоже место в ОП.
3) этого у меня просто нет.ок
1)cделал так
C++
1
cout<<(&p1[1][0]-&p1[0][1])<<endl;
теперь разница в 17.Почему?
Вопрос не в том где 8 байт а где 4 - это и так в книгах описано.

Добавлено через 1 минуту
Цитата Сообщение от PSIAlt Посмотреть сообщение
Почему это они должны идти друг за другом? о_О
Да в этом собственно и вопрос же
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
01.09.2012, 23:36 #6
Разница не в байтах показывается, а в количестве элементов массива.
0
Aliru777
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
01.09.2012, 23:51  [ТС] #7
в интах или лонгах что завсит от машины, компилятора и воли господа Бога.у меня реально что то типа 908 и 9С0 то есть 72 байта или 18 едтниц так как у меня 4 байта...
С этим разобрались(давно).
Вопрос почему как казалось бы между адрессами элементов массив[0][1] и массив[1][0] в 2х мерном массиве 2х2 созданом при помощи операции нью разница аж в 17*кол-во байт для инта
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
01.09.2012, 23:51 #8
Цитата Сообщение от Aliru777 Посмотреть сообщение
Да в этом собственно и вопрос же
Мех-зм индексации устроен так, что при смещении по возрастанию смещения (адресов), сначала меняется крайний правый индекс. То есть первый элемент P[0][0], второй P[0][1] итд.
1
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 23:54 #9
Цитата Сообщение от Aliru777 Посмотреть сообщение
Вопрос почему как казалось бы между адрессами элементов массив[0][1] и массив[1][0] в 2х мерном массиве 2х2 созданом при помощи операции нью разница аж в 17*кол-во байт для инта
Потому что ты создаешь двухмерный массив вот так
C++
1
2
3
4
5
    int **p1=new int*[a];
    cin>>b;
    for(int i=0; i<a; i++)
{
   p1[i] = new int [b];
Каждый следующий new может выделить блок везде, где ему заблагорассудится

З.Ы. Вычитая из указателя int* другой указатель int* ты получаешь не разницу в байтах, а разницу в позициях, то есть число в sizeof(int) раз меньше.
1
Aliru777
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
02.09.2012, 00:05  [ТС] #10
Спасибо PSIAlt!
Теперь понял - то есть компилятор дает мне адресс просто из кучи где ему захочется,но с учетом чтобы мой запрос памяти туда влез,верно?
0
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
02.09.2012, 00:10 #11
Ну да, плюс там дефрагментация и прочая фигня
0
Aliru777
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
02.09.2012, 00:11  [ТС] #12
Цитата Сообщение от PSIAlt Посмотреть сообщение
Вычитая из указателя int* другой указатель int* ты получаешь не разницу в байтах, а разницу в позициях, то есть число в sizeof(int) раз меньше.
это я знаю, я ведь (908-9С0)/4=17 получаю с этим понятно все было
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2012, 00:11
Привет! Вот еще темы с ответами:

Что использовать с указателями? 0, NULL, nullptr? - C++
NULL в WinDef.h описан как #define NULL 0. То есть в случае использования как с указателями, так и другими переменными разницы 0. Про...

Debug asserion failed(expression:_p!=nullptr) - C++
Не понимаю в чем ошибка,вылетает на 183 строке #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; ...

Описать класс n-мерных векторов - C++
Класс n-мерных векторов Базовый класс (координаты начала и конца вектора Совет: реализовать дополнительный класс NPoint, содержащий в...

Создание n-мерных массивов в функции - C++
Доброго времени суток! Вот сижу, и туплю на элементарщине. Если возможно, помогите понять кое что: Задание такое: необходимо создать массив...


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

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

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