Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2010, 10:53   #1
GrindeX
Пользователь
 
Регистрация: 02.05.2009
Сообщений: 26
По умолчанию Адресная арифметика и матрица.

Доступ к массиву с помощью указателя, все работает:
Код:
int arr[10];
int *p = arr;
*(p+5)=5;
Но как сделать тоже самое только для матрицы?
Код:
int arr[10][10];
int *p=arr; //И не работает.

Последний раз редактировалось GrindeX; 08.03.2010 в 10:55.
GrindeX вне форума Ответить с цитированием
Старый 08.03.2010, 11:25   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Двумерный массив - это одномерный массив одномерных массивов.
Код:
int arr[10][10];
int ** p = arr;
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 08.03.2010, 11:49   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Цитата:
int arr[10][10];
int ** p = arr;
не будет такое работать...

Последний раз редактировалось NiCola999; 08.03.2010 в 11:59.
NiCola999 вне форума Ответить с цитированием
Старый 08.03.2010, 11:55   #4
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
#include <iostream.h>

int main()
{
	int **matr, **p, k = 1;

	matr = new int*[2];

	for(int i = 0; i < 2; i++)
		*matr = new int[2];

	p = matr;

	for(int n = 0; n < 2; n++)
		for(int m = 0; m < 2; m++)
		{
			*((*p+n)+m) = k;
			k++;
		}

	for(int l = 0; l < 2; l++){
		for(int j = 0; j < 2; j++)
			cout << *(*p+l)+j << " ";

		cout << "\n";
	}

	return 0;
}

Последний раз редактировалось profi; 08.03.2010 в 12:01.
profi вне форума Ответить с цитированием
Старый 08.03.2010, 11:59   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

а вот так будет:
Код:
int arr[10][10];
int **p = (int**) arr;
NiCola999 вне форума Ответить с цитированием
Старый 08.03.2010, 12:53   #6
GrindeX
Пользователь
 
Регистрация: 02.05.2009
Сообщений: 26
По умолчанию

Цитата:
Сообщение от NiCola999 Посмотреть сообщение
а вот так будет:
Код:
int arr[10][10];
int **p = (int**) arr;
А как обраться например к arr[2][2];
GrindeX вне форума Ответить с цитированием
Старый 08.03.2010, 13:05   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

хм... сам пока не разобрался =(
NiCola999 вне форума Ответить с цитированием
Старый 08.03.2010, 13:36   #8
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

в общем обращаться к двумерному массиву через указатель можно так:
Код:
int arr[n][m];
int *ptr2 = arr[0];
std::cout << ptr2[i*n+j]  // n-число элементов в строке, i,j индексы
аналогично 3х мерный массив
Код:
int arr[a][b][c];
int *ptr3 = arr[0];
std::cout << ptr3[i*a+j*b+k]

Последний раз редактировалось NiCola999; 08.03.2010 в 13:41.
NiCola999 вне форума Ответить с цитированием
Старый 08.03.2010, 15:03   #9
Stepler
Форумчанин
 
Аватар для Stepler
 
Регистрация: 03.02.2008
Сообщений: 213
По умолчанию

Цитата:
Но как сделать тоже самое только для матрицы?
Не совсем верное выражение, матрицы, векторы это математичесские термины, массивы это всего лиш программный способ представления матриц или просто однотипных данных.

Двумерный массив например arr[2][7] и одномерный arr[14] в памяти распологаются последовательно, следовательно и метод доступа что для одномерно что для двумерного будет такой же!
Вот маленький пример:
Код:
#include<iostream.h>
#include<conio.h>
#define r 10 //koli4estvo strok
#define s 10 //koli4estvo stolbcov
void main(void)
{
 clrscr();
 int arr[r][s];
 int *p = arr[0];
 arr[2][7] = 56;
 cout<<*(p + 2*s + 7)<<endl; //dostup po ukazatelju
 cout<<p[2*s+7]; //alternativnyj dostup po ukazatelju
}
Пишу программы на заказ, контакты под аватаром!
Отзывы тут
Stepler вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятки с DirectX (матрица поворота, камера, матрица проекции) ROD Общие вопросы C/C++ 2 17.09.2010 17:00
Outlook + Адресная книга + контакты anikon Microsoft Office Excel 1 28.10.2009 15:40
адресная переменная и двумерный массив? jojahti Общие вопросы C/C++ 9 13.08.2009 19:00
Адресная книга immor Общие вопросы Delphi 4 07.06.2009 18:51
Адресная книга Snake_ua PHP 6 26.02.2008 09:40