Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



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

Пусть сделано следующее объявление:

int b[5]={1,2,3,4,5}, *p;,

которое означает, что объявлены массив целых чисел b[5] и указатель на целое р. Задать указателю р адрес первого элемента массива можно с помощью следующего оператора:

р=&b[0];

Массивы в Си++ реализованы так, как будто имя массива (например, b) является указателем. Поэтому, указателю можно присвоить адрес массива (т.е. адрес первого элемента массива) следующим образом:

p=b;

После выполнения этого оператора обе переменные – p и b – будут указывать на целочисленную переменную, доступную в программе как b[0]. Фактически, имена b[0], *b и *p являются тремя различными именами одной и той же переменной. У переменных b[1], b[2] и т.д. также появляются новые имена:

*(b+1) *(b+2)...

или

*(p+1) *(p+2)...

В этой записи скобки необходимы, потому что приоритет * выше, чем +.

В данном случае "+2" означает "добавить к адресу указателя смещение, соответствующее 2-м целым значениям".

Главное, что нужно запомнить относительно сложения и вычитания значений из указателя – в выражениях Си++ указывается не число, которое нужно вычесть (или добавить) из адреса, а количество переменных заданного типа, на которые нужно "сместить" адрес.

Арифметические выражения с указателями иногда позволяют более кратко записать обработку массивов.

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

#include <stdio.h>

void main()

{

int a[5], sum=0, *p;

int kol=0, i;

p=&a[0]; // инициализация указателя адресом первого элемента

printf("Ввод данных в массив a[ ]:\n");

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

{

printf("a[%d]= ", i);

scanf("%d", p+i); // смещенный указатель

}

// расчет суммы и количества положительных элементов

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

if (*(p+i)>0)

{

sum=sum+*(p+i);

kol++;

}

// вывод исходных данных и результатов

printf("\nЭлемент массива Адрес элемента массива \n");

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

printf("%8d %20X\n",*(p+i),(p+i));

printf("nсумма = %d\nколичество = %d\n",sum,kol);

}

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

Ввод данных в массив a[ ]:

a[0]=1

a[1]=2

a[2]=5

a[3]=5

a[4]=4

Элемент массива Адрес элемента массива

1 12FF6C

2 12FF70

5 12FF74

5 12FF78

4 12FF7C

сумма = 17

количество = 5

Рассмотрим пример объявления двумерного массива:

int mas[4][2];

int *ptr;

Тогда выражение ptr=mas указывает на первый столбец первой строки матрицы. Записи mas и &mas[0][0] равносильны. Выражение ptr+1 указывает на mas[0][1], далее идут элементы: mas[1][0], mas[1][1], mas[2][0] и т.д.; ptr+5 указывает на mas[2][1].

Двумерные массивы располагаются в памяти подобно одномерным массивам, занимая последовательные ячейки памяти (рис. 2).

ptr ptr+1 ptr+2 ptr+3 ptr+4 ptr+5...

mas[0][0] mas[0][1] mas[1][0] mas[1][1] mas[2][0] mas[2][1] ...  

Рис. 2. Размещение двумерного массива в памяти

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

Пример. Программа, в которой с помощью указателей формируется двумерный массив а[4][5], а из минимальных элементов его столбцов формируется массив b[5]. Значения полученных массивов выводятся на экран.

#include <stdio.h>

void main()

{

const int m=4, n=5;

int a[m][n], b[n], min, *p, i, j;

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

p = &a[0][0];

printf("Введите данные в массив a[%d][%d]:\n",m,n);

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

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

{

printf("a[%d][%d]= ",i,j);

scanf("%d", p+i*n+j); // ввод массива

}

// расчет массива b[n]

for(j=0; j<n; j++) // цикл по столбцам

{

// присваивание min значения первого элемента столбца

min=*(p+j);

// цикл по строкам, начиная со второго элемента

for(i=1; i<m; i++)

if (*(p+i*n+j) < min) min =*(p+i*n+j);

*(b+j)= min;

}

printf("\nВывод исходного массива a[,]:\n");

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

{

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

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

printf("\n");

}

printf("\nВывод полученного массива\n");

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

printf(" %d",*(b+j));

printf("\n");

}





Дата публикования: 2015-01-23; Прочитано: 426 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...