Взаимосвязь массивов и указателей — КиберПедия 

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

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

2023-01-02 16
Взаимосвязь массивов и указателей 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;

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


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

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

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...



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

0.021 с.