Автор работы: Пользователь скрыл имя, 20 Марта 2011 в 00:49, лекция
Между массивами и указателями существует очень тесная связь, поэтому обычно их рассматривают вместе. Но, прежде чем исследовать эту связь, давайте проверим наши знания о массивах и пополним их, а уж после этого перейдем к изучению связи между массивами и указателями.
Массивы
Инициализация массивов и классы памяти
Указатели массивов
Функции, массивы и указатели
Использование указателей при работе с массивами
Операции с указателями
Многомерные массивы
Инициализация двумерного массива
Указатели и многомерные массивы
Функции и многомерные массивы
Сначала
запоминается первая строка, за ней вторая,
затем третья и т. д. Таким образом, в нашем
примере:
pri == &zippo[0][0] /* 1-я строка, 1 столбец */
pri + 1 == &zippo[0][1] /* 1-я строка, 2 столбец */
pri + 2 == &zippo[1][0] /* 2-я строка, 1 столбец */
pri
+ 3 == &zippo[1][1] /* 2-я строка, 2 столбец */
Получилось?
Хорошо, а на что указывает pri + 5? Правильно,
на
zippo[2][1].
Мы описали двумерный массив как массив массивов. Если zippo является именем нашего двумерного массива, то каковы имена четырех строк, каждая из которых является массивом из двух элементов? Имя первой строки zippo [0], имя четвертой строки zippo [3]; вы можете заполнить пропущенные имена. Однако имя массива является также указателем на этот массив в том смысле, что оно ссылается на первый его элемент. Значит,
zippo[0] == &zippo[0][0]
zippo[1] == &zippo[1][0]
zippo[2] == &zippo[2][0]
zippo[3]
== &zippo[3][0]
Это
свойство является более, чем новшеством.
Оно позволяет использовать функцию,
предназначенную для
/* одномерная функция, двумерный массив */
main ()
{
static int junk [3] [4] = {
int row;
for (row = 0; row < 3; row++ )
printf(" Среднее строки %d равно %d.\n",
row, mean(junk[row], 4) ); /* junk [row] — одномерный массив из четырех элементов */
}
/* находит среднее в одномерном массиве */
int mean(array,n)
int array[], n;
{
int index; long sum;
if (n > 0)
{
for (index = 0, sum = 0; index < n; index++)
sum += (long) array [index];
return( (int) (sum/n) );
}
else
{
printf("Heт массива\n");
return(0);
}
}
Результат
работы программы:
Среднее строки 0 равно 5.
Среднее строки 1 равно 250.
Среднее
строки 2 равно 50.
Предположим,
что вы хотите иметь функцию, работающую
с двумерным массивом, причем со
всем целиком, а не с частями. Как
вы запишите определения функции и ее
описания? Подойдем к этому более конкретно
и скажем, что нам нужна функция, управляющая
массивом junk[][] в нашем последнем примере.
Пусть функция main () выглядит так:
/* junk в main */
main ()
{
static int junk[3][4] = {
stuff(junk);
}
Функция stuff () использует в качестве аргумента junk, являющийся указателем на весь массив. Как написать заголовок функции, не зная, что делает stuff ()?
Попробуем
написать:
stuff (junk)
int
junk[];?
или
stuff(junk)
int
junk[][];?
Нет и нет. Первые два оператора еще будут работать некоторым образом, но они рассматривают junk как одномерный массив, состоящий из 12 элементов. Информация о расчленении массива на строки отсутствует.
Вторая
попытка ошибочна, потому что хотя
оператор и указывает, что junk является
двумерным массивом, но нигде не говорится,
из чего он состоит. Из шести строк и двух
столбцов? Из двух строк и шести столбцов?
Или из чего-нибудь еще? Компилятору недостаточно
этой информации. Ее дают следующие операторы:
stuff(junk)
int
junk[][4];
Они сообщают компилятору, что массив следует разбить на строки по четыре столбца.
Массивы
символьных строк являются особым случаем,
так как у них нулевой символ
в каждой строке сообщает компилятору
о конце строки. Это разрешает описания,
подобные следующему:
char
*list[];
Символьные строки представляют одно из наиболее частых применений массивов и указателей; мы вернемся к этой теме позднее.
Что вы должны были узнать
Вопросы и ответы
Вопросы
#define PC(X, Y) printf("%c %c\n", X, Y)
char ref[] = { D, О, L, Т};
main ()
{
char *ptr;
int index;
for (index = 0; ptr = ref; index < 4; index++, ptr++ )
PC(ref[index], *ptr);
}
int *ptr;
static int boop[4] = {12, 21, 121, 212};
ptr = boop;
static float awk[2][2] = { { 1.0, 2.0}, {3.0, 4.0}};
ptr = awk[0];
static int jirb[4] = {10023, 7};
ptr = jirb;
static int torf[2][2) = {12, 14, 16};
ptr = torf[0];
static int fort[2][2] = {{ 12}, {14, 16}};
ptr = fort[0];
Ответы
D D
О О
L L
Т Т
Упражнение