4 (Семинары)
Описание файла
Файл "4" внутри архива находится в папке "Семинары". PDF-файл из архива "Семинары", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Семинар 4 (1 курс, С)Функции. Передача параметров. УказателиСтандартно в "Си" при вызове функции через механизм передачи параметров предаютсязначения переменных. Сами переменные оказываются недоступны для функции. Вернутьвычисленное значение в вызывающую программу вызываемая функция может через своеимя. Пример: функция, возводящая в квадрат вещественное число.
Значение этого числапоступает на вход функции в качестве параметра этой функции. Результат работы функциивозвращается в вызывающую программу.double sq(double);//прототип функцииdouble sq(double x) //сама функция, x - формальный параметр{double work;//рабочая переменнаяwork = x*x;return work;//возвращаем вычисленное значение квадрата}В основной программе функция sq может быть вызвана (использована) следующим образом:y = 2.;f = sq(y);// результат присваивается переменной fОбмен значений двух переменных.i = 5;j = 6;k = i;i = j;j = k;//k - рабочая переменная для временного хранения значения i.Реализуем тот же обмен значений двух целочисленных переменных в виде отдельнойфункции change:void change(int *i, int *j)- в качестве параметров функция{//получает указатели на переменные i и j.int k;//Теперь она может непосредственно изменятьk = *i;*i = *j;*j = k;//сами переменные.//операция "*" - раскрытие указателя, - взять значение,//на которое указывает указатель}В основной программе функция change должна быть вызвана следующим образом:change(&i, &j);Семинар 4 (1 курс, С)2где операция "&" означает получение адреса соответствующей переменной.
При этом адресвыступает в качестве значения указателя. Таким образом, значениями указателей являютсяадреса других переменных (в общем случае, других объектов).Пример функции, изменяющей значения своих аргументов (точнее переменных, на которыеони ссылаются). Ввод с клавиатуры:int i;float v1;double v2;scanf(”%d %f %lf”,&i, &v1, &v2);Пример использования указателейint x=1, y=2;int *ip;ip = &x;y = *ip;// ip на x// y = 1*ip = 0;// x = 0Имена массивов как указателиПусть мы хотим написать функцию func, присваивающую n элементамцелочисленного массива значение целой переменной jj.void func(int y[], int, int);//прототип функцииint main(int argc, char* argv[]){int y[10];int n= 10, jj = 7;func(y,n,jj);// вызов функции (не y[0])}void func(int y[], int n, int jj) //заголовок функции{int i;// тело функцииfor(i=0; i<n; i++)y[i]=jj;}Та же функция, написанная c использованием указателя:void func(int *y, int n, int jj){int i;for(i=0; i<n; i++)*(y+i)=jj;}Вызов прежний!func(y,n,jj);Семинар 4 (1 курс, С)Арифметика указателей3- указатель на переменную целого типа (точнее на объект)int *ip;float *fp;double *dp;char *cp;int y[3] = {9417, 738, 936};94177389364 байта4 байта4 байтаint *ip;адресip = &y[0]илиip = y;ip = ip + 1;// на следующий элементy[0] = *ip;// 738y[i] ≡ *(y+i) !!!Приоритет и связываниеint i,j, *a;i+++j;//i+++++j;errori+++(++j);*a++;(i++)+j;Ok*(a++);Структурыstruct str{float x;int i;} a;//!типа intСеминар 4 (1 курс, С)int j;4sruct str a;a.x =7.0;a.i = 1;Объединенияunion str{short x;Байт 2 xchar c;Байт 1 x, c} a;a.x =0x1F1B;printf ("\n%x%x", a.x, a.c); --> 0x1F1B0x1BУказатели на структуруstruct str a, *ap;ap = &a;(*ap).x = 7.0;илиap->x=7.0;Массив структурstruct str a[3];ia[0].x = 7.0;5a[1].i = 5;x7.0012Б.
Керниган, Д. Ритчи. Язык программирования Си. §§ 5.1-5.4, 6.1-6.4, 6.8..