В программировании типично использование массивов строк. Например, процессор ввода в базу данных может проверять команды пользователя в строковом массиве. Для создания массива строк используется двумерный массив символов. Левый индекс определяет число строк, а правый индекс – максимальное число символов в каждой строке. Данный фрагмент кода объявляет массив из 30 строк, каждая может содержать до 79 символов включительно:
char str_array [30] [80];
Доступ к отдельным строкам очень прост – необходимо написать имя массива только с левым индексом. Например:
gets(str_array[2]);
Данная строка эквивалентна
gets(&str_array[2][0]);
но предыдущий вариант более типичен при написании профессиональных программ.
Рассмотрим программу, использующую массив как основу простейшего текстового редактора.
#include <stdio.h>
#define MAX 100
#define LEN 255
char text[MAX][LEN];
/* простейший текстовый редактор*/
int main()
{
register int t, i, j;
for(t=0; t<MAX; t++) {
printf("%d: ", t);
gets(text[t]);
if(!*text[t]) break;/*выход по пустой строке*/
}
/*посимвольный вывод текста*/
for(i=0; i<t; i++) {
for(j=0; text[i][j]; j++)
printf("%c",text[i][j]);
printf("%c", '\n');
}
getchar();
return 0;
}
Данная программа осуществляет ввод текста, пока не встретится пустая строка. Затем она отображает каждую строку. В целях иллюстрации она выводит текст посимвольно, с использованием правого индекса.
С позволяет создавать массивы с размерностями больше двух. Многомерный массив объявляется следующим образом:
тип имя[размерN]…[размер2][ размер1];
1.Передача массивов в функции
2.Аргументы функции main()
3.Использование прототипов функций
4.Возврат указателей
5.Рекурсия
Когда массив используется в качестве аргумента функции, передаётся только адрес массива, а не копия всего массива. При вызове функции с именем массива в функцию передаётся указатель на первый элемент массива. Параметр должен иметь тип, совместимый с указателем. Имеется три способа объявления параметра, предназначенного для получения указателя на массив. Во-первых, он может быть объявлен как массив. Пример:
#include <stdio.h>
void display(int num[10]);
int main(void)
{ int t[10], i;
for(i = 0; i < 10; ++i) t[i] = i;
display(t);
return 0;
}
void display(int num[10])
{ int i;
for(i=0; i<10; ++i) printf(“%d “, num[i]);
}
Хотя параметр num объявляется как целочисленный массив из 10 элементов, С автоматически преобразует его указателю на целочисленный тип данных.
Следующий способ состоит в объявлении параметра для указания на безразмерный массив, как показано ниже:
void display(int num[ ])
{ int i;
for(i=0; i<10; ++i) printf(“%d “, num[i]);
}
где num объявлен как целочисленный массив неизвестного размера. Поскольку С не предоставляет проверку границ массива, настоящий размер массива не имеет никакого отношения к параметру.
Последний способ, которым может быть объявлен num, - это наиболее типичный способ, применяемый при написании профессиональных программ, - через указатель. Пример:
void display(int *num)
{ int i;
for(i=0; i<10; ++i) printf(“%d “, num[i]);
}
Важно понять, что при использовании массива в качестве аргумента функции происходит передача в его функцию его адреса. Это означает, что код внутри функции может изменять значение массива, используемого при вызове.
При передаче многомерных массивов функции следует определить все размерности, кроме самой левой, это нужно компилятору для корректной индексации массива. Например, если массив определён как
int m[4][5][6][7];
то функция func1(), получающая m, может выглядеть следующим образом:
int func1(int d[][5][6][7])
{
…
}
Аргументы функции main()
По стандарту поддерживаются два агрумента main() – это argc и argv. Они позволяют передавать аргументы командной строки в программу. Аргументы командной строки – это информация, следующая за именем программы в командной строке операционной системы.
Параметр argc содержит число аргументов командной строки и является целым числом. Он всегда больше либо равен 1, поскольку имя программы квалифицируется как первый аргумент. Параметр argv – это указатель на массив символьных указателей. Каждый элемент данного массива указывает на аргумент командной строки. Все аргументы командной строки – это строки, все числа конвертируются программой во внутренний формат. Следующая программа выводит “Hello”, а затем имя пользователя, если его набрать прямо за именем программы:
#include <stdio.h>
int main(int argc, char *argv[])
{ if(argc!=2) {
printf(“You forgot to type your name\n”);
return 1;
}
printf(“Hello%s”, argv[1]);
return 0;
}
Аргументы командной строки должны отделяться пробелами или табуляциями. Запятые, точки с запятыми и им подобные символы не рассматриваются как разделители. Если необходимо передать строку, содержащую пробелы или табуляции в виде одного аргумента, то её следует заключить в двойные кавычки. Например:
“this is a test”
Пример по использованию аргументов командной строки. Программа отсчитывает в обратном порядке от значения, указанного в командной строке и подаёт сигнал. Если в качестве второго аргумента присутствует строка “display”, то на экране будет отображаться счётчик.
Прототипы функций служат двум целям: во-первых, они определяют тип возвращаемого функцией значения, во-вторых, они определяют тип и число аргументов, используемых функциями. Прототип имеет следующий вид:
тип имя_функции(список параметров);
Прототип помещается в начало программы.
Формально при создании прототипа функции не требуется включать имена параметров. Например, следующие два варианта корректны и равнозначны:
char func(char *, int);
char func(char *str, int count);
Тем не менее, если включить имена параметров, компилятор использует имена для выдачи сообщений о несоответствии типов.