Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Взаимосвязь массивов и указателей

2023-01-02 41
Взаимосвязь массивов и указателей 0.00 из 5.00 0 оценок
Заказать работу

Вверх
Содержание
Поиск

Указатели и одномерные массивы

• В языке С++ между указателями и массивами существует тесная связь.

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

• В языке С++ имя массива без индексов трактуется как адрес начального элемента. То есть имя массива является указателем на массив.

• Таким образом, доступ к элементам массива осуществляется через указатель с именем массива.

Указатели и одномерные массивы

Поскольку имя массива является указателем, допустимо, например, такое присваивание:

int arr а y[25];

int *ptr;

ptr=array; // эквивалентно ptr =& arr а y [0]

Здесь указатель ptr устанавливается на адрес первого элемента массива.

Указатели и одномерные массивы

• Адрес каждого элемента массива можно получить, используя одно из трех выражений:

• А обращение к пятому элементу массива можно записать как:

array[4],*(array + 4),*(рtr + 4)

Указатели и одномерные массивы

• С++ дает два способа обращения к элементу массива:

– с помощью индексированного имени;

– посредством арифметики с указателями.

• Версия с индексированным именем выполняется медленнее, так как в языке С++ на индексирование массива уходит больше времени, чем на выполнение оператора *.

• Использование указателей для доступа к элементам массива в языке С++ применяется довольно часто.

Указатели и одномерные массивы

int array[10];

int *p;

p=&array[0];

*array=2; printf("%d\n", array[0]);

array[0]=2; printf("%d\n", array[0]);

*(array+0)=2; printf("%d\n", array[0]);

*p=2; printf("%d\n", array[0]);

p[0]=2; printf("%d\n", array[0]);

*(p+0)=2; printf("%d\n", array[0]);

Указатели и двумерные массивы

• Элементы двумерных массивов располагаются в памяти подряд по строкам.

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

int arr[m][n]:

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

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

Указатели и двумерные массивы

Указатели на двумерные массивы в языке С++ – это массивы массивов, т.е. такие массивы, элементами которых являются массивы.

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

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

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

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

Указатели и двумерные массивы

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.

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

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

Указатели и двумерные массивы

обращение к элементу 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]

*(*(ptr + 1) + 2)

*(ptr + 1*3 + 2)

Указатели и двумерные массивы

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]);

Указатели и двумерные массивы

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("\n\n");

Указатели и двумерные массивы

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

/* 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("\n\n");

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

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

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

Указатели на структуры

• Указатель на структуру объявляется точно так же, как и указатель на данные простых типов: используется операция '*' и указывается тип данных. Тип данных структуры указывается заданием ключевого слова struct и имени шаблона этой структуры.

ИмяСтруктурногоТипа *ИмяУказателяНаСтруктуру

Например:

struct goods *p_goods;

struct student *p_stu1, *p_stu2;

Указатели на структуры


Поделиться с друзьями:

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

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

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...



© cyberpediasu.com 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.011 с.