Читайте также: |
|
Указатели и массивы
Массив – это набор пронумерованных однотипных данных.
Синтаксис определения массива:
спецификатор_типа array[константное_выражение];
В определении массива array – имя массива, константное_выражение – ко-
личество элементов в массиве, спецификатор_типа – тип элементов в масси-
ве. Все элементы массива пронумерованы, начиная с нуля.
При определении массива его элементы можно инициализировать сле-
дующим образом:
спецификатор_типа array[ ]={ значение1,значение2, …, значениеN };
В фигурных скобках { } через запятую перечисляются значения элемен-
тов массива соответствующего типа.
В языке СИ между указателями и массивами существует некоторая связь.
Когда объявляется массив, то его имя отождествляется с константой, значение
которой равно адресу нулевого элемента массива.
Пример определения и использования массива.
int array[5]={2, 8, 45, 16, 12}; /* Определение и инициализация массива */
int *ptr; /* Определение указателя */
ptr=&array[0]; /* Присваивание адреса нулевого элемента массива
указателю ptr */
Указатель ptr устанавливается на адрес нулевого элемента масcива, при-
чем присваивание ptr=&array[0] можно записать в эквивалентной форме
ptr=array.
Между именем массива и указателем, выступающим в роли имени масси-
ва, существует важное различие. Указатель – это переменная, поэтому допус-
тима операция изменения ее значения: ptr=array или ptr++. Но имя массива не
является переменной, и записи типа array =ptr или array++ ошибочны.
Многомерные массивы так же часто используются, как и одномерные. Вот примеры: в школьных журналах написаны Фамилия и класс; любые базы данных; Вообще, многомерные массивы - это массивы массивов. Т.е. каждый индексный номер содержит массив. Вот пример уже из языка Си:
int i[2][4] = {{1,2,3,4}, {5,6,7,8}};
Т.е. тут мы создаем двумерный массив размером 2х4. Т.е. 2 строчки по 4 элемента каждая.
В принципе, остальное тут так же. Давайте теперь рассмотрим, как в многомерном массиве вводить и выводить элементы:
#include <conio.h>
#include <stdio.h>
int main()
{
int arr[2][4];
for (int i = 0; i < 2; i++){
for (int j = 0; j < 4;j++){
scanf ("%d", &arr[i][j]);
}
}
for (int i = 0; i < 2; i++){
for (int j = 0; j < 4;j++){
printf ("%d ", arr[i][j]);
}
printf ("\n");
}
getch();
return 0;
}
Все очень похоже на одномерный массив. Только в многомерном массиве мы создаем двойной цикл, первый - это проход по столбцу, а второй - это проход по элементам массива (идем по строке).
Во всех моих примерах при изменении размера многомерного массива, например вместо arr[2][4], хочу сделать arr[7][6]. Так вот, что бы сделать такое изменения придется изменять абсолютно все циклы, так как они ориентируются по старым данным. Но есть способ исправить эту проблему.
Для этого в языке С/C++ есть директива предпроцессора define. Давайте рассмотрим его на примере:
#include <conio.h>
#include <stdio.h>
#define SIZE_A 2
#define SIZE_B 2
int main()
{
int arr[SIZE_A][SIZE_B];
for (int i = 0; i < SIZE_A; i++){
for (int j = 0; j < SIZE_B;j++){
scanf ("%d", &arr[i][j]);
}
}
for (int i = 0; i < SIZE_A; i++){
for (int j = 0; j < SIZE_B;j++){
printf ("%d ", arr[i][j]);
}
printf ("\n");
}
getch();
return 0;
}
Т.е. мы можем поменять значения только в одном месте, и они автоматом поменяются во всех остальных местах. Причем подстановка будет происходить на этапе компиляции
Осталось научиться передавать многомерные массивы в функцию. Вот как это делается:
void printArr (int arr[][2]){ //тело; }
Тут обязательным условием является написание во втором индексе количества элементов, иначе компилятор выдаст ошибку. Ах да, вызывается функция из программы, так же как и одномерный массив:
printArr(arr);
Вот и все, что хотелось вам рассказать о многомерных массивах. Лучше всего любой материал по программированию запоминается на практике.
Дата добавления: 2015-12-08; просмотров: 38 | Нарушение авторских прав