Язык программирования C++ для профессионалов


Параметр-массив


Если в качестве параметра функции указан массив, то передается указатель на его первый элемент. Например:

int strlen(const char*);

void f() { char v[] = "массив"; strlen(v); strlen("Николай"); }

Это означает, что фактический параметр типа T[] преобразуется к типу T*, и затем передается. Поэтому присваивание элементу формального параметра-массива изменяет этот элемент. Иными словами, массивы отличаются от других типов тем, что они не передаются и не могут передаваться по значению.

В вызываемой функции размер передаваемого массива неизвестен. Это неприятно, но есть несколько способов обойти данную трудность. Прежде всего, все строки оканчиваются нулевым символом, и значит их размер легко вычислить. Можно передавать еще один параметр, задающий размер массива. Другой способ: определить структуру, содержащую указатель на массив и размер массива, и передавать ее как параметр. Например:

void compute1(int* vec_ptr, int vec_size); // 1-ый способ

struct vec { // 2-ой способ int* ptr; int size; };

void compute2(vec v);

Сложнее с многомерными массивами, но часто вместо них можно использовать массив указателей, сведя эти случаи к одномерным массивам. Например:

char* day[] = { "mon", "tue", "wed", "thu", "fri", "sat", "sun" };

Теперь рассмотрим функцию, работающую с двумерным массивом - матрицей. Если размеры обоих индексов известны на этапе трансляции, то проблем нет:

void print_m34(int m[3][4]) { for (int i = 0; i<3; i++) { for (int j = 0; j<4; J++) cout << ' ' << m[i][j]; cout << '\n'; } }

Конечно, матрица по-прежнему передается как указатель, а размерности приведены просто для полноты описания. Первая размерность для вычисления адреса элемента неважна, поэтому ее можно передавать как параметр:

void print_mi4(int m[][4], int dim1) { for ( int i = 0; i<dim1; i++) { for ( int j = 0; j<4; j++) cout << ' ' << m[i][j]; cout << '\n'; } }




Начало  Назад  Вперед



Книжный магазин