В разделе 16.1.1 будет показано, как можно написать эту функцию способом, позволяющим передавать ссылочный параметр массива любого размера.
Напомним, что в языке С++ нет многомерных массивов (см. раздел 3.6). Вместо многомерных массивов есть массив массивов.
Подобно любому массиву, многомерный массив передается как указатель на его первый элемент (см. раздел 3.6). Поскольку речь идет о массиве массивов, элемент которого сам является массивом, указатель является указателем на массив. Размер второй размерности (и любой последующий) является частью типа элемента и должен быть определен:
//
//
void print(int (*matrix)[10], int rowSize) { /* ... */ }
Объявляет matrix
указателем на массив из десяти целых чисел.
*matrix
снова необходимы:
int *matrix[10]; //
int (*matrix)[10]; //
Функцию можно также определить с использованием синтаксиса массива. Как обычно, компилятор игнорирует первую размерность, таким образом, лучше не включать ее:
//
void print (int matrix[][10], int rowSize) { /* ... */ }
Здесь объявление matrix
выглядит как двумерный массив. Фактически параметр является указателем на массив из десяти целых чисел.
Упражнение 6.21. Напишите функцию, получающую значение типа int
и указатель на тип int
, а возвращающую значение типа int
, если оно больше, или значение, на которое указывает указатель, если больше оно. Какой тип следует использовать для указателя?
Упражнение 6.22. Напишите функцию, меняющую местами два указателя на тип int
.
Упражнение 6.23. Напишите собственные версии каждой из функций print()
, представленных в этом разделе. Вызовите каждую из этих функций для вывода i
и j
, определенных следующим образом:
int i = 0, j[2] = {0, 1};
Упражнение 6.24. Объясните поведение следующей функции. Если в коде есть проблемы, объясните, где они и как их исправить.
void print(const int ia[10]) {
for (size_t i = 0; i != 10; ++i)
cout << ia[i] << endl;
}
6.2.5. Функция main()
: обработка параметров командной строки
Функция main()
— хороший пример того, как программы на языке С++ передают массивы в функции. До сих пор функция main()
в примерах определялась с пустым списком параметров.
int main() { ... }
Но зачастую функции main()
необходимо передать аргументы. Обычно аргументы функции main()
используют для того, чтобы позволить пользователю задать набор параметров, влияющих на работу программы. Предположим, например, что функция main()
программы находится в исполняемом файле по имени prog
. Параметры программе можно передавать следующим образом:
prog -d -о ofile data0
Так, параметры командной строки передаются функции main()
в двух (необязательных) параметрах:
int main(int argc, char *argv[]) { ... }
Второй параметр, argv
, является массивом указателей на символьные строки в стиле С, а первый параметр, argc
, передает количество строк в этом массиве. Поскольку второй параметр является массивом, функцию main()
, в качестве альтернативы, можно определить следующим образом:
int main(int argc, char **argv) { ... }
Обратите внимание: указатель argv
указывает на тип char*
. При передаче аргументов функции main()
первый элемент массива argv
содержит либо имя программы, либо является пустой строкой. Последующие элементы передают аргументы, предоставленные в командной строке. Элемент сразу за последним указателем гарантированно будет нулем.
С учетом предыдущей командной строки argc
содержит значение 5, a argv
— следующие символьные строки в стиле С:
argv[0] = "prog"; //
argv[1] = "-d";
argv[2] = "-o";
argv[3] = "ofile";
argv[4] = "data0";
argv[5] = 0;
argv
помните, что дополнительные аргументы начинаются с элемента argv[1]
; элемент argv[0]
содержит имя программы, а не введенный пользователем параметр.