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

Что такое двумерный массив? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Копирую строчки двумерного массива и программа начинает вести себя странно http://www.cyberforum.ru/cpp-beginners/thread341725.html
В общем, есть некоторый полузапиленный код. #include <iostream> #include <cstdlib> #include <stdlib.h> #include <conio.h> #include <time.h> using namespace std; void showmass(int**, int,...
C++ При компиляции не может найти хеадер Написал программу.. она пашет, но когда весь код в main.cpp. Решил ее усовершенствовать, чтобы мейн имел красивее вид, сделал вот так: main.cpp: #include <iostream> #include <fstream> #include... http://www.cyberforum.ru/cpp-beginners/thread341692.html
Бот C++
Порекомендуйте библиотеки для имитации нажатия клавиш, кнопок мыши и анализа пикселей с экрана. Хочу написать простенького бота для онлайн игры.
Как убрать знак минус C++
У меня int a = -7. Как программно получить a = 7?
C++ Пояснить про const в возвращаемом типе функции http://www.cyberforum.ru/cpp-beginners/thread341679.html
когда может понадобится написать такое: const int func(int i) { return i+5; } вопрос конкретно за const
C++ Кольсольное приложение win32 или CLR Привет Возникла делема помогите советом. язык C++ где лучше писать на консольном приложении win32 или на консольном приложении CLR ? Если есть ещё кроме них какие то варианты то буду рад их... подробнее

Показать сообщение отдельно
Сыроежка
Заблокирован
14.08.2011, 19:41
Цитата Сообщение от skvor Посмотреть сообщение
Не буду долго объяснять мотивы subj-а, но не получается организовать работу с матрицей как с массивом векторов.

Пытаюсь написать цикл просмотра массива с использованием указателя на элемент в качестве счетчика.

Для вектора
C++
1
2
int b[5]={1,2,3,4,5};
for (int *i=b; i<b+5; ++i) std::cout<<*i<<' ';
Для матрицы, если считать что структура представлена вектором в котором строки последовательно сомкнуты, получается так
C++
1
2
3
4
5
int a[3][5]={{11,12,13,14,15},{21,22,23,24,25},{31,32,33,34,35}};
for (int *i=*a; i<*(a+3); i+=5)
{ for (int j=0; j<5; ++j) std::cout<<*(i+j)<<' ';
  std::cout<<std::endl;
}
это не устраивает тем, что счетчик-указатель внешнего цикла указывает на элемент матрицы (int *), а не на строки, и требуется приращение 5 (длинна строк), а не 1.

Пытаюсь написать
C++
1
2
3
4
5
int a[3][5]={{11,12,13,14,15},{21,22,23,24,25},{31,32,33,34,35}};
for (int **i=a; i<a+3; i+=1)
{ for (int *j=*i; j<*i+5; ++j) std::cout<<*j<<' ';
  std::cout<<std::endl;
}
test.cpp:57: error: cannot convert 'int (*)[5]' to 'int**' in initialization
test.cpp:57: error: comparison between distinct pointer types 'int**' and 'int (*)[5]' lacks a cast
57 строка в файле == 2 строка в примере.

Не понимаю, почему указатель совместим с вектором, а указатель-на-указатель не совместим с указатель-на-вектор?
Из этого следует сделать вывод, что n-мерный массив - это n-мерный массив, а не вектор (n-1)-мерных массивов!? Косвенно это подтверждается тем, что sizeof от матрицы пропорционален размеру матрицы, т.е. указателей на строки не создаётся.
Я вам помогу разобраться, а то тут те, которые считают себя "экспертами по С++", вам внятно ответить не могут.

Итак, вы имеете массив a[ 3 ][ 5 ] и хотите его элементы вывести на пкечать. Фактически, вы имеете массив массивов, то есть a[ 0 ] указывает на массив из 5 элементов, a[ 1 ] указывает на следующимй массив из пяти элементов, а a[ 2 ] указывает на последний массив из пяти элементов. То есть значением a[ i ] является одномерный массив.

Когда вы испеользуете имя массива в выражениях, то он преобразуется в казатель на свой пекрвый элемент. Для вашего массива он преобразуется в указатель int ( * )[ 5 ]. Поэтому в своем внешнем цикле вы должны написать

for ( int ( *p )[ 5 ] = a; p < a + 3; ++p )

А что написать во внутреннем цикле?

Во внутренний цикл вы передаете указатель на массив, то есть int ( *p )[ 5 ]. Тогда если разыменовать этот указатель, то есть использовать выражение *p, то вы получите одномерный массив. В свою очерель если использовать имя одномерного массива в выражении, то оно преобразуется в указатель на его первый элемент.

Итак, мы имеем что выражение *p представляет собой массив вида int[ 5 ]. Если его использовать в выражениях, то он преобразуется в указатель вида int *.

Следовательно внутренний цикл должен быть записан в виде

for ( int *p1 = *p; p1 < *p + 5; ++p1 )

Как говорятфранцузу, вуаля!

Добавлено через 2 часа 37 минут
Хотел бы себя поправить, то есть заменить слово "указывать" на "представляет собой", когда я говорил об a[i] то есть a[0] представляет собой массив размерностью 5, a[1] представляет собой массив размерности 5 и т.д.
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru