Лабораторная работа: Массивы и указатели в языке программирования Си
for (p=&a[9]; p>=&a[0]; p--) /*еще один способ вывода элементов в обратном порядке*/
printf("/n%d",*p);
}
Указатели и двумерные массивы
Предположим, что у нас есть описания:
int z[4][2]; /**/
int pz; / **/
Тогда pz=z указывает на нулевой столбец нулевой строки, т.е.
pz=&z[0][0];
Пример 7. Вывести на экран значения нулевого, второго и четвертого элементов массива.
#include <stdio.h>
int a[]=(10,20,30,40,50,60); /*объявление и инициализация массива а*/
main()
{
for (p=a,i=0; p+i<=a+4; p++, i++)
printf("%d"; (p+i)); / *вывод на экран значений нулевого, второго и четвертого элементов*/
}
В цикле происходит одновременное увеличение указателя р и индекса i на единицу, вследствие чего на экран после нулевого элемента выводится второй, и затем четвертый. Поскольку элементы двумерного массива хранятся в памяти ЭВМ по строкам, то
pz+1 = &z[0][1], pz+2 = &z[1][0], pz+3 = &z[1][1] и т.д.
Двумерный массив описан как массив массивов. Если z является именем массива, то каковы имена четырех строк, каждая из которых является массивом из двух элементов? Имя первой строки z[0], второй - z[1], и т.д. Однако имя массива является также указателем на этот массив в том смысле, что оно ссылается на первый его элемент. Значит:
z[0]=&z[0][0], z[1]=&z[1][0], z[2]=&z[2][0], z[3]=&z[3][0].
Пример 8. Задана матрица а. Вывести на экран элементы главной диагонали, первой строки и значений первых элементов каждой строки матрицы, применив для этого указатели.
#include <stdio.h>
int a[3][3]={{10,20,30},
{40,50,60},
{70,80,90}};
/*объявление и инициализация двумерного массива*/
int *pa[3]={a[0],a[1],a[2]};
/*объявление и инициализация указателя ра на строки массива а и присвоение начальных значений : pa[0]=a[0]; pa[1]=a[1]; pa[2]=a[2]*/