Указатель как параметр функции
Цель работы:закрепить практические навыки работы с указателями.
Краткие теоретические сведения
Рассматривая ранее правила использования функций, мы обращали внимание, что в языке Си возможна только односторонняя передача значений фактических параметров из вызывающей программы к формальным параметрам вызываемой функции. Возвращаемое значение несет сама функция, используемая в качестве операнда в выражении. Отсюда, казалось бы, следует неукоснительное правило: в процессе выполнения функции не могут изменяться значения переменных в вызывающей программе. Однако это правило можно обойти, если в качестве параметров функции использовать указатели.
В примере функция swap() производит обмен значениями двух переменных величин, заданных своими указателями в аргументах.
void swap(int *a, int *b)
{ int c;
c=*a; *a=*b; *b=c;
}
Если в основной программе имеется следующий фрагмент:
int x=1, y=2;
swap(&x, &y);
printf(“x=%d y=%d”, x, y);
то на экран будет выведено:
x=2 y=1
т.е. переменные x и y поменялись значениями.
После обращения к функции указатель a получил адрес переменной x, указатель b – адрес переменной y.после этого переменная x в основной программе и разадресованный указатель *a в функции оказываются связанными с одной ячейкой памяти; так же – y и *b.
Порядок выполнения работы
1. Изучить теоретические сведения.
2. Выполнить задание.
Задания для выполнения
Выполнить задания № 3 и № 5 из лабораторной работы № 25, используя две функции: одну для поиска минимального (максимального) элемента и его индексов, вторую для перестановки указанных элементов.
ЛАБОРАТОРНАЯ РАБОТА № 27
АРГУМЕНТЫ КОМАНДНОЙ СТРОКИ
Цель работы:изучить параметры функции main() и их назначение; научиться разрабатывать программы с использованием параметров функции main(); научиться выполнять программы с использованием командной строки.
Краткие теоретические сведения
После запуска программы управление передается функции main(). Она может возвращать значение в вызвавшую систему и принимать параметры из внешнего окружения. Возвращаемое значение должно быть целого типа. Стандарт предусматривает два формата функции:
тип main() {/*…*/}
или
тип main(int argc, char *argv[]) {/*…*/}
Функция main() имеет два параметра. Имена параметров в программе могут быть любыми, но принято использовать argc и argv.
– argc определяет количество параметров, передаваемых функции, включая имя самой программы;
– argv является массивом указателей на строки, каждая из которых содержит одно слово из командной строки. Если слово должно содержать символ пробел, то при записи его в командную строку оно должно быть заключено в кавычки.
Первый элемент массива argv[0] ссылается на полное имя запускаемого на выполнение файла. Следующий argv[1] указывает на первый параметр; argv[2] – на второй и т.д. Параметр argv[argc] должен быть равен 0.
Если функция main() ничего не возвращает, вызвавшая система получит значение, означающее успешное завершение. Ненулевое значение означает аварийное завершение. Оператор возврата из main() можно опускать.
Использование параметров функции main()
Пример 1.Текст программы сложения двух чисел, введенных из командной строки, сохранен в файле SumToArg.cpp, следовательно исполнимый код будет находиться в файле SumToArg.exe.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{ float a, b;
/* argv[0] содержит имя программы, argv[1] – первое слагаемое; argv[2] – второе слагаемое */
a=atof(argv[1]);
b=atof(argv[2]);
printf (“%f + %f=%f ”,a, b, a+b);
return 0;
}
Так как параметры массива argv являются строками, то для выполнения арифметических операций их значения нужно привести к числовому типу. Для этого в библиотеке stdlib.h имеются функции:
atof(s) – приводит аргумент s к типу float;
atoi (s) – приводит аргумент s к типу int.