Array M. УЭИТ - Язык Си - руководство для начинающих
- Название:Язык Си - руководство для начинающих
- Автор:
- Жанр:
- Издательство:Мир
- Год:1988
- Город:Москва
- ISBN:5-03-001309-1 /русск./
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Array M. УЭИТ - Язык Си - руководство для начинающих краткое содержание
Язык Си — руководство для начинающих
Язык Си - руководство для начинающих - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
/* одномерная функция, двумерный массив */
main( )
{
static int junk[3][4] = {
{2, 4, 6, 8},
{100, 200, 300, 400},
{10, 40, 60, 90} };
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(" Нет массива. \n");
return(0); }
}
Результат работы программы:
Cреднее строки 0 равно 5.
Cреднее строки 1 равно 250.
Cреднее строки 2 равно 50.
Функции и многомерные массивы
Предположим, что вы хотите иметь функцию, работающую с двумерным массивом, причем со всем целиком, а не с частями. Как вы запишите определения функции и ее описания? Подойдем к этому более конкретно и скажем, что нам нужна функция, управляющая массивом junk[ ][ ]в нашем последнем примере. Пусть функция main( )выглядит так:
/* junk в main */
main( )
{
static int junk[3][4] = {
{2, 4, 5, 8},
{100, 200, 300, 400}
{10, 40, 60, 90} };
stuff(junk);
}
Функция stuff( )использует в качестве аргумента junk, являющийся указателем на весь массив. Как написать заголовок функции, не зная, что делает stuff( )?
Попробуем написать:
stuff(junk) int junk[ ];
или
stuff(junk) int junk[ ][ ];
Нет и нет. Первые два оператора еще будут работать некоторым образом, но они рассматривают junkкак одномерный массив, состоящий из 12 элементов. Информация о расчленении массива на строки отсутствует.
Вторая попытка ошибочна, потому что хотя оператор и указывает что junkявляется двумерным массивом, но нигде не говорится, из чего он состоит. Из шести строк и двух столбцов? Из двух строк и шести столбцов? Или из чего-нибудь еще? Компилятору недостаточно этой информации. Ее дают следующие операторы:
stuff(junk)
int junk[ ][4];
Они сообщают компилятору, что массив следует разбить на строки по четыре столбца. Массивы символьных строк являются особым случаем, так как у них нулевой символ в каждой строке сообщает компилятору о конце строки. Это разрешает описания, подобные следующему:
char *list[ ];
Символьные строки представляют одно из наиболее частых применений массивов и указателей; мы вернемся к этой теме в гл. 13.
ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
Как объявить одномерный массив: long id_no[200];
Как объявить двумерный массив: short chess[8][8];
Какие массивы можно инициализировать: внешние и статические.
Как инициализировать массив: static int hats[3]=[10,20,15];
Другой способ инициализации: static int caps[ ]=[3,56,2];
Как получить адрес переменной: использовать операцию &.
Как получить значение, ссылаясь на указатель: использовать операцию *.
Смысл имени массива: hats == &hats[0].
Соответствие массива и указателя: если ptr = hats;то ptr + 2 == &hat[2];и *(ptr+2) == hat[2];
Пять операций, которые можно применять для переменных типа указатель: см. текст.
Метод указателей для функций, работающих с массивами.
ВОПРОСЫ И ОТВЕТЫ
Вопросы
1. Что напечатается в результате работы этой программы?
#define PC(X, Y)
printf(" %с %c \n", X, Y)
char ref[ ] = { D, О, L, Т};
main( )
{
char *ptr;
int index;
for(index =0; ptr = ref; index < 4; index++, ptr++)
PC(ref[indcx], *ptr);
}
2. Почему в вопросе 1 массив refописан до оператора main( )?
3. Определите значение *ptrи *(ptr + 2)в каждом случае:
а. int *ptr;
static int boop[4] = {12, 21, 121, 212};
ptr = bоор;
б. float *ptr;
static float awk[2][2] = { {1.0, 2.0}, {3.0, 4.0}};
ptr = awk[0];
в. int *ptr;
static int jirb[4] = {10023, 7};
ptr = jirb;
г. int = *ptr;
static int torf[2][2] = {12, 14, 16};
ptr = torf[0];
д. int *ptr;
static int fort[2][2] = { { 12}, {14, 16} };
ptr = fort[0];
4. Предположим, у нас есть описание static int grid[30][100];
а. Выразите адрес grid [22][56] иначе.
б. Выразите адрес grid[22][0] двумя способами.
в. Выразите адрес grid[0][0] тремя способами.
Ответы
1.
D D
O O
L L
Т Т
2. По умолчанию такое положение refотносит его к классу памяти типа extern, a массивы этого класса памяти можно инициализировать.
3.
а. 12 и 121
б. 1.0 и 3.0
в. 10023 и 0 (автоматическая инициализация нулем)
г. 12 и 16
д. 12 и 14 (именно 12 появляется в первой строке из-за скобок).
4.
a. &grid[22][56]
б. &grid[22][01 и grid[22]
УПРАЖНЕНИЕ
1. Модифицируйте нашу метеорологическую программу таким образом, чтобы она выполняла вычисления, используя указатели вместо индексов. (Вы по-прежнему должны объявить и инициализировать массив.)
13. Символьные строки и функции над строками
СИМВОЛЬНЫЕ CTРOKИ
ИНИЦИАЛИЗАЦИЯ СИМВОЛЬНЫХ СТРОК
ВВОД-ВЫВОД СТРОК
ИСПОЛЬЗОВАНИЕ ФУНКЦИЙ, РАБОТАЮЩИХ CO CТРОKAMИ
АРГУМЕНТЫ КОМАНДНЫХ СТРОК
СИМВОЛЬНЫЕ CTРOKИ
Символьные строки представляют один из наиболее полезных и важных типов данных языка Си. Хотя до сих пор все время применялись символьные строки, мы еще не все знаем о них. Конечно, нам уже известно самое главное: символьная строка является массивом типа char, который заканчивается нуль-символом ( '\0'). В этой главе мы больше узнаем о структуре строк, о том, как описывать и инициализировать строки, как их вводить или выводить из программы, как работать со строками.
На рис. 13.1 представлена работающая программа, которая иллюстрирует несколько способов создания строк, их чтения и вывода на печать. Мы используем две новые функции: gets( ), которая получаст строку, и puts( ), которая выводит строку. (Вы, вероятно, заметили сходство их имен с функциями getchar( )и putchar( ).) В остальном программа выглядит достаточно привычно.
/* работа со строками */
#include
#deline MSG "У вас, наверное, много талантов.
Расскажите о некоторых" .
/* константа символьной строки */
#define NULL 0
#define LIM 5
#define LINLEN 81 /* максимальная длина строки + 1 */
char ml[ ] = " Только ограничьтесь одной строкой.";
/* инициализация внешнего символьного массива */
char *m2 = " Если вы не можете вспомнить что-нибудь, придумайте.";
/* инициализация указателя внешнего символьного массива */
main( )
{
char name[LlNLEN];
static char talents[LINLEN];
int i;
int count = 0;
char *m3 = " \n Достаточно обо мне -- Как вас зовут?";
/* инициализация указателя */
static char *mytal[LlM] = ("Быстро складываю числа",
Читать дальшеИнтервал:
Закладка: