УКАЗАТЕЛИ И МНОГОМЕРНЫЕ МАССИВЫ

УКАЗАТЕЛИ И МНОГОМЕРНЫЕ МАССИВЫ

     Как создать указатели для многомерных массивов? Чтобы найти ответ на этот вопрос, рассмотрим несколько примеров.

Предположим, что у нас есть описания

int zippo[4][2];  /* массив типа int

                из 4 строк и 2 столбцов */

int *pri;    /* указатель на целый тип */

Тогда на что pri = zippo; указывает? На первый столбец первой строки:

zippo == &zippo[0][0]

      А на что указывает pri + 1? На zippo[0][l], т.е. на 1-ю строку 2-го столбца? Или на zippo[l][0], элемент, находящийся во второй строке первого столбца? Чтобы ответить на поставленный вопрос, нужно знать, как располагается в памяти двумерный массив. Он размещается, подобно одномерным массивам, занимая последовательные ячейки памяти. Порядок элементов определяется тем, что самый правый индекс массива изменяется первым, т. е. элементы массива располагаются следующим образом:

zippo[0][0] zippo[0][1] zippo[1][0] zippo[1][1] zippo[2][0]

...

Сначала запоминается первая строка, за ней вторая, затем третья и т. д. Таким образом в нашем примере:

pri == &zippo[0][0] /* 1-я строка, 1 столбец */

pri + 1 == &zippo[0][1] /* 1-я строка, 2 столбец */

pri + 2 == &zippo[1][0] /* 2-я строка, 1 столбец */

pri + 3 == &zippo[1][1] /* 2-я строка, 2 столбец */

Получилось? Хорошо, а на что указывает pri + 5? Правильно, на zippo[2][l].

     Мы описали двумерный массив как массив массивов. Если zippo является именем нашего двумерного массива, то каковы имена четырех строк, каждая из которых является массивом из двух элементов? Имя первой строки zippo[0], имя четвертой строки zippo[3]; вы можете заполнить пропущенные имена. Однако имя массива является также указателем на этот массив в том смысле, что оно ссылается на первый его элемент. Значит,

zippo[0] == &zippo[0][0]

zippo[1] == &zjppo[1][0]

zippo[2] == &zippo[2][0]

zippo[3] == &zippo[3][0]

     Это свойство является более, чем новшеством. Оно позволяет использовать функцию, предназначенную для одномерного массива, для работы с двумерным массивом! Вот доказательство (хотя мы надеемся, что теперь вы бы поверили нам и так) использования двумерного массива в нашей программе нахождения среднего значения:

/* одномерная функция, двумерный массив */

main( )

{

static int junk[3][4] = {

{2, 4, 6, 8},

{100, 200, 300, 400},

{10, 40, 60, 90} };

int row;

for(row = 0; row < 3; row ++)

printf(" Среднее строки %d равно %d. ", row, mean(junk[row],4));

/* junk [row] - одномерный массив ИЗ четырех элементов */

}

/* находит среднее в одномерном массиве */

int mean(array,n)

int array[ ], n;

{

int index;

long sum;

if(n > 0) {

for(index = 0, sum = 0; index < n; index++)

    sum += (long)array[index];

return((int)(sum/n)); }

else {

printf(" Нет массива. ");

return(0); }

}

Результат работы программы:

Cреднее строки  0 равно 5.

Cреднее строки  1 равно 250.

Cреднее строки  2 равно 50.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

7.2.4 Указатели

Из книги Справочное руководство по C++ автора Страустрап Бьярн

7.2.4 Указатели Если производный класс derived имеет открытый базовый класс base, то указатель на derived можно присваивать перменной типа указатель на base не используя явное преобразовние типа. Обратное преобразование, указателя на base в указтель на derived, должно быть явным.


8.4.2 Массивы, Указатели и Индексирование

Из книги Основы AS/400 автора Солтис Фрэнк

8.4.2 Массивы, Указатели и Индексирование Всякий раз, когда в выражении появляется идентификатор типа массива, он преобразуется в указатель на первый элемент массива. Из-за преобразований массивы не являются lvalue. По определению операция индексирования [] интерпретируется


R.8.2.1 Указатели

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

R.8.2.1 Указатели В описании T D, в котором D имеет вид* список-спецификаций-cv opt D1тип описываемого идентификатора есть"… список-спецификаций-cv указатель на T". Конструкция список-спецификаций-cv относится к указателю, а не к указуемому объекту.Например, в описанияхconst ci = 10, *pc =


R.8.2.3 Указатели на члены

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

R.8.2.3 Указатели на члены В описании T D, в котором D имеет видполное-имя-класса :: * список-спецификаций-cv opt D1тип описываемого идентификатора есть "… список-спецификаций-cv указатель на член класса полное-имя-класса типа T".Например, во фрагментеclass X {public: void f(int); int a;};int X::* pmi =


Многомерные базы данных (MDD)

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Многомерные базы данных (MDD) Реляционные базы данных организованы в виде двумерных таблиц. В MDD имеется одно или несколько дополнительных измерений. Например, Вам надо оценить свои доходы от продаж, рассмотрев в отдельности сводки по товарам, по регионам и по времени. В


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

Из книги C++ для начинающих автора Липпман Стенли

8.1.11. Многомерные массивы Если для численного анализа вам нужны многомерные массивы, то в архиве приложений Ruby есть прекрасная библиотека NArray, которую написал Масахиро Танака (Masahiro Tanaka). Если необходим аппарат для работы с матрицами, обратитесь к стандартной библиотеке


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

Из книги QT 4: программирование GUI на С++ автора Бланшет Жасмин

Многомерные массивы Firebird поддерживает многомерные массивы размерностью от 1 до 16. Например, следующий оператор определяет три столбца целочисленных массивов с двумя, тремя и четырьмя размерностями:CREATE TABLE BTABLE (/* хранит 4 строки по 5 элементов = 20 элементов */ARR_INT2 INTEGER[4,5],/* 6


12. Массивы и указатели

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

12. Массивы и указатели МАССИВЫ. МНОГОМЕРНЫЕ МАССИВЫ. ИНИЦИАЛИЗАЦИЯ МАССИВОВ. УКАЗАТЕЛИ И ОПЕРАЦИИ НАД УКАЗАТЕЛЯМИ. СВЯЗЬ МЕЖДУ МАССИВОМ И УКАЗАТЕЛЕМ. ОПЕРАЦИИ  & * (унарные)Между массивами и указателями существует очень тесная связь, поэтому обычно их рассматривают


ФУНКЦИИ, МАССИВЫ И УКАЗАТЕЛИ

Из книги автора

ФУНКЦИИ, МАССИВЫ И УКАЗАТЕЛИ      Массивы можно использовать в программе двояко. Во-первых, их можно описать в теле функции. Во-вторых, они могут быть аргументами функции. Вес, что было сказано в этой главе о массивах, относится к первому их применению; теперь рассмотрим


МНОГОМЕРНЫЕ МАССИВЫ

Из книги автора

МНОГОМЕРНЫЕ МАССИВЫ      Темпест Клауд, метеоролог, занимающаяся явлением перисто-сти облаков, хочет проанализировать данные о ежемесячном количестве осадков на протяжении пяти лет. В самом начале она должна решить, как представлять данные. Можно использовать 60


Функции и многомерные массивы

Из книги автора

Функции и многомерные массивы      Предположим, что вы хотите иметь функцию, работающую с двумерным массивом, причем со всем целиком, а не с частями. Как вы запишите определения функции и ее описания? Подойдем к этому более конкретно и скажем, что нам нужна функция,


3.3. Указатели

Из книги автора

3.3. Указатели Указатели и динамическое выделение памяти были вкратце представлены в разделе 2.2. Указатель – это объект, содержащий адрес другого объекта и позволяющий косвенно манипулировать этим объектом. Обычно указатели используются для работы с динамически


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

Из книги автора

3.9.1. Многомерные массивы В С++ есть возможность использовать многомерные массивы, при объявлении которых необходимо указать правую границу каждого измерения в отдельных квадратных скобках. Вот определение двумерного массива:int ia[ 4 ][ 3 ];Первая величина (4) задает


Указатели

Из книги автора

Указатели Указатель в С++ — это переменная, содержащая не сам объект, а адрес памяти, где располагается объект. Java и C# имеют аналогичную концепцию «ссылки» при другом синтаксисе. Мы начнем с рассмотрения придуманного нами примера, иллюстрирующего применение указателей:01


Указатели

Из книги автора

Указатели Указатель - это ячейка памяти, хранящая адрес. В PascalABC.NET указатели делятся на типизированные (содержат адрес ячейки памяти данного типа) и бестиповые (содержат адрес оперативной памяти, не связанный с данными какого-либо определенного типа).Тип указателя на