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И
АРГУМЕНТЫ КОМАНДНЫХ СТРОК
Символьные строки представляют один из наиболее полезных и важных типов данных языка Си. Хотя до сих пор все время применялись символьные строки, мы еще не все знаем о них. Конечно, нам уже известно самое главное: символьная строка является массивом типа 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] = ("Быстро складываю числа",
"Точно умножаю",
"Записываю данные",
"Правильно выполняю команды",
"Понимаю язык Си"};
Читать дальше