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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2011, 22:46   #1
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию Печать элементов массива с использованием указателя

Код:
#include <iostream>
using namespace std;


void print_mij(int** m, int dim1, int dim2)
{
   for (int i = 0; i < dim1; i++) {
       for (int j = 0; j < dim2; j++)
        //cout << ' ' << ((int*)m)[i * dim2 + j];
    	   cout << m[i][j];
       cout << endl;
  }
}

int main() {
	int **arr;
	const int rows = 3;
	const int cols = 8;
	int i;

	arr = new int*[rows]; // создние одномерного массива указателей на одномерные массивы (на строки двумерного массива)
	for (i = 0; i < rows; i++)
		arr[i] = new int[cols]; //выделение памяти под столбцы в каждой строке

	arr[0][1] = 8;
	cout << arr[0][1] << endl;

	print_mij((int**)arr, rows, cols);

	for (int i = 0; i < rows; i++)
	        delete [] arr[i]; //очистка памяти занятой под столбцы каждой строки
	delete [] arr; //удаление массива указателей на одномерные массивы (на строки двумерного массива)

	return 0;
}
Не могу понять почему работает не так как я ожидаю - заккоментрированый вариант в функции print_mij.
А ожидаю я, что он будет работать также как и cout << m[i][j].
При использовании закомментированного варианта на экран выводятся левые значения.
g++, ubuntu.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 23.06.2011, 23:02   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

потому что у вас не статический массив, а динамический, он прерывистый, состоит из кусков, потому нельзя так делать.

выведите себе адреса каждой ветки массива.
for(int i=0;i<rows;i++)cout<<arr[i]<<endl;
и увидите сами.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.06.2011, 23:04   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Код:
int** m
m - указатель на указатель; он указывает на массив указателей, каждый из которых в свою очередь указывает на массив-строку, так что так как Вы написали вывести не получится.
Ваш вариант верен в случае если мы одномерный массив используем вместо двухмерного, типа
Код:
int *m=new int[dim1*dim2];
m[i*dim1+j]=6; // эквивалент m[i][j] при нормальных двухмерных массивах
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 23.06.2011, 23:09   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Не могу понять почему работает не так как я ожидаю - заккоментрированый вариант в функции print_mij.
нуу.. видимо ты не понимаешь, что делаешь ну или я не понимаю, что ты делаешь. одно из двух)

Код:
cout << *(*(m + i) + j);
далее
Код:
print_mij((int**)arr, rows, cols);
зачем?

и кстати
Цитата:
g++, ubuntu.
бесполезная информация
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 23.06.2011 в 23:17.
pproger вне форума Ответить с цитированием
Старый 24.06.2011, 00:24   #5
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

2 Пепел Феникса - за ответ спасибо, ты пояснил очень четко (впрочем, как всегда) именно то, что я не понимал - память под массив в данном случае выделятся не из последовательных кусков. Теперь понимаю почему левые значения на экране.
2 Granus - с твоим примером все ясно, этот способ я рассматривал еще до того, как написал сюда вопрос. За ответ спасибо.
Код:
#include <iostream>
using namespace std;


void print_mij(int** m, int dim1, int dim2)
{
   for (int i = 0; i < dim1; i++) {
       for (int j = 0; j < dim2; j++)
        cout << ' ' << ((int*)m)[i * dim2 + j];
    	 //  cout << m[i][j];
       cout << endl;
  }
}

int main() {

	const int rows = 3;
	const int cols = 8;
	int *arr = new int[rows * cols];

	arr[6] = 8;
	print_mij((int**)arr, rows, cols);

	delete [] arr; //удаление массива

	return 0;
}
2 pproger - я пытался напечатать массив, передав указатель на него в функцию, при условии, что размеры массива неизвестны на этапе компиляции. Константами я их сделал так для примера, чтобы не тратить время на ввод их вручную в запущенной программе.
Насколько я понял ты говоришь мне, что запись
Код:
cout << *(*(m + i) + j);
эквивалентна записи
Код:
cout << m[i][j];
Это я понимаю.
И ее можно использовать в функции print_mij(int** m, int dim1, int dim2)
Но что значит твой вопрос
Цитата:
зачем?
я так и не понял


Если кто против, что общаюсь на ты - напишите.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли

Последний раз редактировалось Roof; 24.06.2011 в 00:27.
Roof вне форума Ответить с цитированием
Старый 24.06.2011, 00:35   #6
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от Roof Посмотреть сообщение
Но что значит твой вопрос я так и не понял
Там просто было преобразование типа
Код:
(int**)arr
А arr и так объявлен как:
Код:
int **arr;
An1ka вне форума Ответить с цитированием
Старый 24.06.2011, 00:59   #7
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

An1ka - понятно, это упустил из виду. Спасибо.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод элементов массива.Изменение элементов массива. Vesnushka18 Помощь студентам 6 09.06.2011 13:05
определения массива как указателя jon888 Общие вопросы C/C++ 2 09.05.2011 13:00
Си - Выделение кучи -> инициализация указателя -> запись массива Renat060888 Общие вопросы C/C++ 3 22.11.2010 19:31
Инкремент для указателя массива структур Valter Общие вопросы C/C++ 6 31.05.2010 18:30
В одномерном массиве, состоящем из n вещественных элементов, вычислить сумму элементов массива HazelHen Общие вопросы C/C++ 2 29.03.2009 15:16