Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Указатель на массив указателей и указатель на массив

Динамические многомерные массивы

Инициализация многомерных массивов

Многомерные массивы

Многомерный массив – это массив массивов.

Пример определения:

int A[2][3];

Данное определение можно раскрыть следующим образом: А – массив из двух элементов, элементами массива являются массивы из трех элементов типа int.

Элементы следуют в памяти в следующем порядке:

A[0][0], A[0][1], A[0][2], A[1][0], A[1][1], A[1][2]

Обращаться к элементам массива можно с помощью индексного выражения или с помощью указателей

A[0][1]=5;

A[i][j]=i+j; // или

*(*(A+i)+j)=i+j;

Инициализация многомерных массивов может проводиться по аналогии с одномерными массивами. Например:

int A[2][3][2]={ 1, 2, 3, 4, 5};

Инициализируются первые 5 элементов по их расположению в оперативной памяти, т.е. элементы с индексами: 000, 001, 010, 011, 020

Но удобнее использовать вложенные фигурные скобки, при этом самая левая размерность может не указываться, а определяться по умолчанию:

int B[][5]={{ 1, 2, 3}, { 6, 7}, { 1, 2, 3, 4, 5 }};

В примере создается массив размерности 3 × 5 (аналог матрицы 3 × 5, при этом в первой строке инициализируются 3 элемента, во второй – 2 элемента, в третьей – все 5 элементов).

 

По аналогии с одномерными массивами многомерные массивы могут создаваться динамически. Рассмотрим пример создания двухмерного массива n × m (матрица n × m), при этом значения n и m заранее неизвестны – вводятся с клавиатуры. В примере создается матрица n × m, заполняется случайными числами, выводится на печать, в конце программы память освобождается.

#include <stdio.h>

#include <stdlib.h>

void main()

{

int **p; // Указатель на указатель может быть использован для выделения памяти под

// 2-х мерный массив динамически

int n, m; // Заранее неизвестные размерности массива

int i, j; // Индексные переменные

printf("n="); scanf("%d", &n); // Ввод с клавиатуры числа строк матрицы

printf("m="); scanf("%d", &m); // Ввод с клавиатуры числа столбцов матрицы

p=malloc(n*sizeof(int *)); // Выделяем память под массив указателей

// Выделяем память для каждого указателя в массиве указателей

for(i=0; i<n; i++) p[i]=malloc(m*sizeof(int));

// Заполняем массив (матрицу) случайными числами и печатаем его

for(i=0; i<n; i++)

{

for(j=0; j<m; j++)

{

p[i][j]=rand() % 100; // Получаем псевдослучайное целое число

printf("%d ", p[i][j]);

}

printf("\n"); // После печать строки матрицы переход на новую строчку

}

// Освобождаем память, порядок освобождения обратен порядку выделения

for(i=0; i<n; i++) free(p[i]); // Освобождаем память для строк матрицы

free(p);// освобождаем память для массива указателей

}

 

Следует отметить, что с помощью скобок () в языке Си можно создавать указатели разных типов. Существуют указатели на массивы указателей и указатели на массивы заданного типа и заданного числа элементов.

Например:

int ** p1; // Указатель на массив указателей

int (*p2)[10]; // Указатель на массив из 10 элементов типа int

При выполнении арифметических операций с такими указателями будет происходить следующее:

p1++; // Значение адреса увеличится на 4

p2++; // Значение адреса увеличится на 40=4*10 в Win32

Это происходит потому, что при выполнении арифметических операций с указателями за единицу принимается размер объекта в памяти, на который указывает указатель.

В заключение представим пример программы, которая выполняет сортировку элементов массива в порядке неубывания. При сортировке используется алгоритм прямого выбора: в массиве размерности n ищется минимальный элемент, потом минимальный элемент меняется местами с первым элементом, после этого первый элемент будет на своем месте; на следующем шаге рассматривается массив размерности на единицу меньший (без первого элемента) к нему применяется тот же алгоритм, и т.д. Массив в программе создается динамически, размерность вводится с клавиатуры, заполняется случайными числа и выводится на печать до сортировки и после сортировки.

#include <stdio.h>

#include <stdlib.h>

void main()

{

int *pM; // Указатель на массив

int n; // Число элементов массива

printf("n="); scanf("%d", &n); // Ввод числа элементов

// Выделение памяти для массива

pM=(int *)malloc(n*sizeof(int));

// Заполняем массив псевдослучайными числами в интервале 0..99

for(int i=0; i<n; i++) pM[i]=rand() % 100;

// Печатаем исходный массив

for(int i=0; i<n; i++) printf("%d ", pM[i]);

for(int i=0; i<n-1; i++) // Считаем, что массив начинается с i-го

// элемента

{

int imin=i, // Индекс миниамльного элемента

// (считаем минимальным i-ый элемент)

min=pM[i]; // Значение минимального элемента

// Сравниваем выбранный элемент со всеми последующими

for(int j=i+1; j<n; j++)

if (pM[j]<min) // Нашли элемент меньший чем min

{

min=pM[j];

imin=j;

}

// Минимальный элемент меняем с i-m

pM[imin]=pM[i];

pM[i]=min;

}

// Пеачть массива после сортировки

printf("\n"); // Переход на новую строчку

for(int i=0; i<n; i++) printf("%d ", pM[i]);

}

 

<== предыдущая лекция | следующая лекция ==>
Динамические массивы | Struct A
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 348; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.