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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2009, 05:52   #1
Di3el
 
Аватар для Di3el
 
Регистрация: 14.12.2009
Сообщений: 7
По умолчанию int **x

Здравствуйте! у меня вопрос: что в данной программе обозначает **x пожалуйста дайте полное её описание. Спасибо!

Текст программы:

Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
// функции
void vvod (int **x, int nx, int mx);// ввод элементов матрицы
void vivod (int **x, int nx, int mx);// вывод элементов матрицы
void min (int **x, int nx, int mx, int &imin, int &jmin);// нахождение минимальных //элементов матриц
// основная функция
void main()
{
	clrscr();
	int n, m, k, l; // количество строк и столбцов матрицы
	int **a, **b; // указатели на двумерные матрицы
	int j, i; // переменные размерности матрицы
	int imina, jmina, iminb, jminb; // индексы минимальных элементов
	int d; // переменная для обмена
	printf ("\n BBeduTe pa3mepHocTb MaTPuLLbI a");
	scanf ("%d%d", &n, &m);
	printf ("\n BBeduTe pa3mepHocTb MaTPuLLbI b");
	scanf ("%d%d", &k, &l);
	a = new int*[n];
	for ( i=0; i<n; i++)
		a[i] = new int [m];
	b = new int*[k];
	for ( i=0; i<k; i++)
		b[i] = new int [l];
	// 1) ввод элементов матрицы
	printf ("\nIIePBoHa4aJlbHbIE 3Ha4eHu9I MaTpuLL");
	printf ("\n BBeduTe MaTPuLLy a");
	vvod (a, n, m);
	printf ("\n BBeduTe MaTPuLLy b");
	vvod (b, k, l);
	// 2) вывод элементов матрицы
	printf ("\n MaTPuLLa a");
	vivod (a, n, m);
	printf ("\n MaTPuLLa b");
	vivod (b, k, l);
	// 3) нахождение минимальных элементов матриц
	min (a, n, m, imina, jmina);
	min (b, k, l, iminb, jminb);
	// 4) замена минимальных элементов матриц
	d = a[imina] [jmina];
	a[imina][jmina] = b[iminb][jminb];
	b[iminb][jminb] = d;
	// 5) вывод элементов массива после замены минимальных элементов
	printf ("\nMaTpuLLbl IIocJle 3aMeHbI MuHuMaJlbHbIx 3Ha4eHuu'");
	printf ("\n MaTPuLLa a");
	vivod (a, n, m);
	printf ("\n MaTPuLLa b");
	vivod (b, k, l);
	getch ();
}

// функция для ввода элементов матриц
void vvod (int **x, int nx, int mx)
{
	int j, i;
	for ( i=0; i<nx; i++)
		for ( j=0; j<mx; j++)
			scanf ("%d", &x[i][j]);
}
// функция для вывода элементов матриц
void vivod (int **x, int nx, int mx)
{
	int j, i;
	for ( i=0; i<nx; i++)
	{
		for (j=0; j<mx; j++)
			printf ("\n %5d", x[i][j]);
	}
}
// функция нахождения отрицательых 
// элементов матриц
void min (int **x, int nx, int mx, int &imin, int &jmin)
{
	int j, i;
	imin = 1; // значения для индексов
	jmin = 1; // минимального элемента
	for ( i=0; i<nx; i++)
		for ( j=0; j<mx; j++)
			if (x[i][j]<[imin][jmin])
			{
				imin = i;
				jmin = j;
			}
}

Последний раз редактировалось Stilet; 14.12.2009 в 08:45.
Di3el вне форума Ответить с цитированием
Старый 14.12.2009, 08:51   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

На самом деле не **x, а int** (может писаться как int** x, int **x, int ** x - без разницы). Т.е. указатель на указатель на int. Понимать это следует как одномерный массив одномерных массивов => двумерный массив или матрица. Массивы передавать по значению нельзя, поэтому они передаются в виде указателей. Ну и поскольку в самом указателе не содержится информация, является ли он указателем на единственный элемент, или же на массив, и если второе - то какой этот массив длины, то одновременно с указателем передается количество элементов в массивах (одном массиве int* и нескольких массивах int)

P.S. А для оформления кода используйте тег CODE (кнопка # в редакторе сообщения)
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 14.12.2009, 09:14   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
что в данной программе обозначает **x
Это указатель на указатель на переменную типа целое.
Видимо это сделано для того чтоб динамически размещать двумерный массив в памяти.
Вот a = new int*[n]; размещает массив указателей на строки (), a[i] = new int [m]; сами строки создает
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2009, 18:36   #4
Di3el
 
Аватар для Di3el
 
Регистрация: 14.12.2009
Сообщений: 7
По умолчанию

а можно поточнее про указатель на указатель? или ссылку пожалуйста)
Di3el вне форума Ответить с цитированием
Старый 14.12.2009, 19:08   #5
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Di3el Посмотреть сообщение
а можно поточнее про указатель на указатель? или ссылку пожалуйста)
ссылка
кстати эта ссылка тоже указатель на указатель
m0nax вне форума Ответить с цитированием
Старый 14.12.2009, 19:33   #6
Di3el
 
Аватар для Di3el
 
Регистрация: 14.12.2009
Сообщений: 7
По умолчанию

да я искал так, но толком простого и точного понятия не нашёл( мне нужно преподавателю за эту тему рассказать
Di3el вне форума Ответить с цитированием
Старый 14.12.2009, 20:14   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Ну смотрите. TYPE* var; - это указатель на объект var типа TYPE. Указатель тоже является типом, поэтому можно создать указатель на объект этого типа:
Код:
TYPE ** var;
ничем не хуже
Код:
typedef TYPE* PTYPE;
PTYPE * pvar;
В итоге получается указатель на указатель. Поскольку в C++ существует тесная связь между указателями и массивами, то X* x; может быть массивом объектов типа X. Тут мы получаем, что pvar - указатель на массив объектов типа PTYPE, которые могут быть указателями на первые элементы массивов. Вот и получится, что у нас есть одномерный массив одномерных массивов, т.е. двумерный массив.
И не зря в C++ двумерные массивы записываются как, например,
Код:
int matrix[2][3];
это именно что массив массивов по сути своей.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 15.12.2009, 12:56   #8
Di3el
 
Аватар для Di3el
 
Регистрация: 14.12.2009
Сообщений: 7
Вопрос

// функция для вывода элементов матриц
void vivod (int **x, int nx, int mx)
{
int j, i;
for ( i=0; i<nx; i++)
{
for (j=0; j<mx; j++)
printf ("\n %5d", x[i][j]);
}
}
как должна выглядеть блок-схема для утого куска? у меня получилась но преподаватель забраковал, что не то?
Изображения
Тип файла: png Безымянный.png (6.9 Кб, 50 просмотров)
Di3el вне форума Ответить с цитированием
Старый 16.12.2009, 17:16   #9
Di3el
 
Аватар для Di3el
 
Регистрация: 14.12.2009
Сообщений: 7
По умолчанию

может кто поправить блок схему?

Последний раз редактировалось Di3el; 16.12.2009 в 17:18.
Di3el вне форума Ответить с цитированием
Старый 16.12.2009, 18:06   #10
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Примерно так
Вложения
Тип файла: doc Doc2.doc (79.0 Кб, 18 просмотров)
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
float to int Артэс Общие вопросы C/C++ 1 14.12.2009 01:20
float to int span4 SQL, базы данных 7 01.06.2009 10:57
char to int kezman Общие вопросы C/C++ 3 24.07.2008 08:59
из char в int llin Общие вопросы C/C++ 13 11.07.2008 06:51
из char в int?? Mika Общие вопросы C/C++ 4 20.06.2008 15:18