Студопедия

КАТЕГОРИИ:


Архитектура-(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 arr[m][n]:

Адрес (arr[i][j])= Адрес(arr[0][0]) + (i*n+j)*k,

где k – количество байтов, выделяемое для элемента массива (в зависимости от типа).

Указатели на двумерные массивы в языке С++ – это массивы массивов, т.е. такие массивы, элементами которых являются массивы. При объявлении таких массивов в памяти компьютера создается несколько различных объектов. Например, при выполнении объявления двумерного массива:

int arr [4][3];

1) В памяти выделяется участок для хранения значения переменной arr, которая является указателем на массив из четырех указателей.

2) Для этого массива из четырех указателей тоже выделяется память. Каждый из этих четырех указателей содержит адрес одномерного массива из трех элементов типа int.

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

Схематично распределение памяти для данного двумерного массива выглядит так:

arr

¯

arr[0] ® arr[0][0] arr[0][1] arr[0][2]

arr[1] ® arr[1][0] arr[1][1] arr[1][2]

arr[2] ® arr[2][0] arr[2][1] arr[2][2]

arr[3] ® arr[3][0] arr[3][1] arr[3][2]

Таким образом, объявление arr[4][3] порождает в программе три разных объекта:

· указатель с идентификатором arr,

· безымянный массив из четырех указателей: arr[0], arr[1], arr[2], arr[3]

· безымянный массив из двенадцати чисел типа int.

1) Для доступа к безымянным массивам используются адресные выражения с указателем arr. Доступ к элементам одномерного массива указателей осуществляется с указанием одного индексного выражения в форме arr[2] или *(arr+2).

2) Для доступа к элементам двумерного массива чисел типа int arr[i][j] должны быть использованы следующие выражения:

Например, пусть i=1, j=2, тогда

обращение к элементу arr[1][2]:

· arr[i][j] arr[1][2]=10

· *(*(arr+i)+j) *(*(arr+1)+2)=10

· (*(arr+i))[j] (*(arr+1))[2]=10

Например, с помощью указателя ptr:

int *ptr=arr обращение к элементу arr[1][2]:

· ptr[1*3 + 2]

/*здесь 1 и 2 - это индексы используемого элемента,

а 3 это число элементов в строке*/

· ptr[5]

Причем внешне похожее обращение arr[5] выполнить невозможно, так как указателя с индексом 5 не существует.

· *(*(ptr + 1) + 2)

· *(ptr + 1*3 + 2)

Пример 2. Использование индексных и адресных выражения при обработке двумерных массивов.

#include "stdafx.h"

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[]){

int i, j;

int t[2][3]; // при вводе обращение с помощью индексов

// можно использовать адресные выражения

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

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

t[i][j]=i+j;

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

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

//при печати рассматриваем имя массива как указатель на начало

printf(" %d ", *(*(t + i) +j));

//или printf(" %d ", (*(t + i))[j]);

system("pause");

return 0;

}

 

Пример 3. Демонстрация связи между матрицей и указателем на нее.

#include "stdafx.h"

#include <iostream>

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[]){

int i,j;

int t[2][3],*ptr;

ptr=&t[0][0];

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

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

t[i][j]=i+j;

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

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

printf(" %d ", *(ptr+i*3+j));

printf(" ");

//С матрицей так делать нельзя

/* for(i=0;i<2;i++)

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

printf(" %d ", *(t + i*3 +j)); */

//Корректная работа с матрицей

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

printf(" %d ", ptr[i]);

printf(" ");

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

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

printf(" %d ", ptr[i*3 +j]);

system("pause");

return 0;

}

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


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


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



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




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