КАТЕГОРИИ: Архитектура-(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]); }
Дата добавления: 2014-01-11; Просмотров: 348; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |