Передача массивов

C

Если аргумент процедуры – массив, то используется механизм передачи по адресу. При этом в список аргументов включается имя массива, в вызываемую процедуру передается адрес первого элементанулевыми индексами) и массив некопируется в локальную память функции. При описании float a[10][10] обращение вида: <имя_функции>(a) эквивалентно обращению: <имя_функции>(&a[0][0]). Следовательно, массивы-параметры занимают память, отводимую в вызывающей процедуре массивам-аргументам, поэтому в вызываемой процедуре допустимы описания вида floatb[], a[][10]; Длины всех измерений, кроме первого, надо задавать, чтобы правильно извлечь из памяти значения нужного элемента массива (см. формулу в параграфе "Распределение массивов"). Допустимо даже несоответствие размерностей аргумента и параметра.

Пример.

Аргументы Параметры

float a[5][5], b[36]; float a[ ], b[ ][6];

Пример. Вычислить: z=uТbu, где {ui]}, i=1...4; {bij]}, i,j=1...4.

/* Вычисление квадратичной формы */

void main(void){

float u[4], /* Входной вектор */

b[4][4], /* Входная матрица */

v[4], /* Вектор b*u */

z, /* Результат */

scalar(float u[ ], float v[ ]); /*Скалярное произведение векторов */

int i, j;

/* Умножение матрицы на вектор */

void matrix(floatb[ ][4], float u[ ], float v[ ]);

printf("Исходный вектор:\n");

for(i=0; i<4; i++){

scanf("%f", &u[ i ]);

}

printf("Исходная матрица:\n");

for(i=0; i<4; i++){

for(j=0; j<4; j++){

scanf("%f", &b[ i ][ j ]);

}

}

matrix(b, u, v );

z=scalar(v, u );

printf("\n\n\nКвадратичная форма равна %.5g\n", z);

}/* End main */

/* Умножение матрицы на вектор */

void matrix(float a[ ][4], float x[ ], float y[ ]){

int i, j;

for(i=0; i<4; i++){

for(y[ i ]=j=0; j<4; j++){

y[ i ] += a[ i ][ j ]*x[ j ];

}

}

}/* End matrix */

/* Скалярное произведение векторов */

float scalar(float x[ ], float y[ ]){

int i;

float z;

for(z=i=0; i<4; i++){

z+=x[ i ]*y[ i ];

}

return z;

}/* End scalar */

Basic

Массивы передаются также по адресу, поэтому изменение их в вызывающей процедуре затруднений не вызывает.

Дальнейший материал относится только к языкам Cи C++. В языке Basic подобных средств нет.