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

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

Восстановить пароль Регистрация
 
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
01.09.2012, 22:22     Адрессация в 2-х мерных динамических массивах и nullptr #1
Сегодня читал стаью о памяти,указателях итп
Написал программу для динамического 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?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2012, 22:22     Адрессация в 2-х мерных динамических массивах и nullptr
Посмотрите здесь:

C++ скалярное произведение двух n-мерных векторов
объединить три 2-мерных массива в один 3-мерный массив C++
C++ nullptr в codeblocks
C++ Что использовать с указателями? 0, NULL, nullptr?
C++ О динамических массивах и константах
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
01.09.2012, 23:19     Адрессация в 2-х мерных динамических массивах и nullptr #2
2) имя массива еще и является адресом, по которому в памяти находится первый элемент массива.
3) nullptr - c++ 11
1) p1[1][1] и p1[0][1] - у вас разница между э-ми в целую строку массива .

если друг за другом то разница 2-4 байта - от компилятора зависит.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
01.09.2012, 23:25     Адрессация в 2-х мерных динамических массивах и nullptr #3
Цитата Сообщение от MrCold Посмотреть сообщение
от компилятора зависит
От системы а не компилятора. В 32-битных системах указатель равен 4 байте, 64 - 8 байт.
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 23:29     Адрессация в 2-х мерных динамических массивах и nullptr #4
Цитата Сообщение от Aliru777 Посмотреть сообщение
Вопрос почему разница между адрессом p1[1][1] и p1[0][1] 18(у меня) - те я думал что они должны идти друг за другом, как [1][0] и [1][1]
Почему это они должны идти друг за другом? о_О
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
01.09.2012, 23:34  [ТС]     Адрессация в 2-х мерных динамических массивах и nullptr #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 Посмотреть сообщение
Почему это они должны идти друг за другом? о_О
Да в этом собственно и вопрос же
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
01.09.2012, 23:36     Адрессация в 2-х мерных динамических массивах и nullptr #6
Разница не в байтах показывается, а в количестве элементов массива.
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
01.09.2012, 23:51  [ТС]     Адрессация в 2-х мерных динамических массивах и nullptr #7
в интах или лонгах что завсит от машины, компилятора и воли господа Бога.у меня реально что то типа 908 и 9С0 то есть 72 байта или 18 едтниц так как у меня 4 байта...
С этим разобрались(давно).
Вопрос почему как казалось бы между адрессами элементов массив[0][1] и массив[1][0] в 2х мерном массиве 2х2 созданом при помощи операции нью разница аж в 17*кол-во байт для инта
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6154 / 2883 / 281
Регистрация: 04.12.2011
Сообщений: 7,677
Записей в блоге: 3
01.09.2012, 23:51     Адрессация в 2-х мерных динамических массивах и nullptr #8
Цитата Сообщение от Aliru777 Посмотреть сообщение
Да в этом собственно и вопрос же
Мех-зм индексации устроен так, что при смещении по возрастанию смещения (адресов), сначала меняется крайний правый индекс. То есть первый элемент P[0][0], второй P[0][1] итд.
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 23:54     Адрессация в 2-х мерных динамических массивах и nullptr #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) раз меньше.
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
02.09.2012, 00:05  [ТС]     Адрессация в 2-х мерных динамических массивах и nullptr #10
Спасибо PSIAlt!
Теперь понял - то есть компилятор дает мне адресс просто из кучи где ему захочется,но с учетом чтобы мой запрос памяти туда влез,верно?
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
02.09.2012, 00:10     Адрессация в 2-х мерных динамических массивах и nullptr #11
Ну да, плюс там дефрагментация и прочая фигня
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2012, 00:11     Адрессация в 2-х мерных динамических массивах и nullptr
Еще ссылки по теме:

C++ Бьёт ошибку! 11 D:\Ïðàêòèêà ïo C++\Çàäà÷à 15\main.cpp `nullptr' undeclared (first use this function)
C++ Вывод неповторяющихся элементов в динамических массивах
C++ ОпенМП расспаралелить скалярное произведение двух n-мерных векторов (массивов)

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

Или воспользуйтесь поиском по форуму:
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
02.09.2012, 00:11  [ТС]     Адрессация в 2-х мерных динамических массивах и nullptr #12
Цитата Сообщение от PSIAlt Посмотреть сообщение
Вычитая из указателя int* другой указатель int* ты получаешь не разницу в байтах, а разницу в позициях, то есть число в sizeof(int) раз меньше.
это я знаю, я ведь (908-9С0)/4=17 получаю с этим понятно все было
Yandex
Объявления
02.09.2012, 00:11     Адрессация в 2-х мерных динамических массивах и nullptr
Ответ Создать тему
Опции темы

Текущее время: 20:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru