Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Массивы и указатели в языке С++ тесно связаны и могут использоваться почти эквивалентно. Так, имя массива является константным указателем на первый элемент массива, а указатели можно использовать для выполнения любой операции, включая индексирование массива.
Пусть сделано следующее объявление:
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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!