C
Поскольку в языках Cи C++ реализована передача аргументов по значению, то для того, чтобы в вызываемой процедуре можно было изменять значение исходного аргумента, туда необходимо передавать адрес области памяти, где хранится аргумент. При этом функция не может изменить этот адрес, а содержание может. Для получения адреса используется оператор &. Следовательно, соответствующий параметр – указатель!!
Пример. Дана матрица {aij}, i,j=1...10. Найти max{aij} и его индексы.
float maxmatr(float a[10][10], int *k, int *l){
float max;
int i, j;
max = a[0][0];
for(*k=*l=i=0; i<10; i++){
for(j=0; j<10; j++){
if(max<a[ i ][ j ]){max=a[ i ][ j ]; *k=i; *l=j; }
}
}
return max;
}/* End maxmatr */
Соответствующий фрагмент вызывающей процедуры имеет вид:
float maxmatr(float a[ ][10], int*, int* ), // Прототип
maxim, // Максимальный элемент
a[10][10]; // Исходная матрица
int m, n; // Ее размеры
..................................
maxim=maxmatr(a, &m, &n);
Употребление конструкции float a[ ][10] будет пояснено ниже.
Те же вычисления можно реализовать в виде подпрограммы.
void maxmatr(floata[10][10], int*k, int *l, float *max){
float *max;
......................
Также везде надо заменить max на *max и убрать инструкцию return.
Пример.
Функция scanf: список данных – это выходные аргументы, поэтому при обращении надо использовать адреса (&), printf: список данных – входные аргументы, поэтому используются значения.
Basic
Поскольку по умолчанию аргументы передаются по адресу, то никаких ухищрений не требуется. Если изменить значение аргумента в вызываемой процедуре, то оно сохранится после возврата.