- •Конспект лекций по дисциплине "Программирование"(іі часть)
- •123 "Компьютерная инженерия"
- •1 Функции 6
- •1 Функции
- •1.1 Определение, описание, вызов функции
- •Void prn1(int X)
- •Void prn2()
- •Void main()
- •1.2 Передача параметров в функции по значению и по указателю
- •Void func(int intg,float fltp)
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •1.3 Функции и массивы
- •Int func1(int arr[]) {...}
- •Void main()
- •Void main()
- •Void main()
- •1.4 Функции с умалчиваемыми значениями параметров
- •Void main()
- •Void main()
- •1.5 Функции с переменным числом параметров
- •Void main()
- •Void main()
- •1.6 Передача параметров в функцию main()
- •Int main(int argc,char**argv,char**envp)
- •Int main(int argc,char **argv)
- •1.7 Рекурсивные и подставляемые функции
- •Void main()
- •Void main()
- •1.8 Функции, возвращающие указатель
- •Void main()
- •1.9 Функции и структуры
- •Void f1(stud a)
- •Void f3(stud *p)
- •Void main()
- •1.10 Перегрузка функций
- •Void main()
- •Void main()
- •Int mul(double X,double y)
- •Int sum(int X) {return 2*X;}
- •Void main()
- •1.11 Шаблоны функций
- •Int main()
- •Void func(a);
- •Int main()
- •1.12 Указатели на функции
- •Void main()
- •Int f2(int X){return X*X;};
- •Void main()
- •Void main()
- •2 Работа с файлами
- •2.1 Потоковый ввод-вывод
- •2.2 Открытие и закрытие потока
- •Int fclose(file *имя);
- •Int main()
- •Void perror(const char *str);
- •2.3 Посимвольный ввод-вывод
- •Int fputc(int ch, file *fp);
- •Int fgetc(file *fp);
- •2.4 Построчный ввод-вывод
- •Int fputs(char*string, file *fp);
- •2.5 Форматированный ввод-вывод
- •Int fprintf(file *fp, char *format [,аргумент]…);
- •Int fscanf(file *fp, char *format [,указатель]…);
- •2.6 Форматированные вывод в строку и ввод из строки
- •Int a2; long b2;
- •2.7 Блоковый ввод-вывод
- •Int fwrite(void *ptr, int size, int n, file *fp);
- •Int fread(void *ptr,int size,int n,file *fp);
- •2.8 Произвольный доступ к файлу
- •Int fseek(file *fp, long offset, int from_where);
- •Int main()
- •3 Многофайловая компиляция
- •Void main()
- •Void main()
- •4 Объекты и их атрибуты
- •Void main()
- •5 Ссылки
- •Int &хref; // ошибка!!
- •Int f2_ptr(int *a, int *b) {return *a-*b;}
- •Int f4_ref(const int&a, int &b)
- •Void main()
- •Литература
Void main()
{char oper; ---
int x=2,y=4,z; |
. . . |
{int k=5; ––– |
int x=3; | |
x+=3 .. | |
} ––– |
…} –––
В первом примере область видимости первого х весь фрагмент программы, второго х только блок. Область действия первого х весь фрагмент программы, за исключением блока, где определен второй х, в этом блоке область действия второго х.
Тип компоновки, или тип связывания, определяет соответствие идентификатора конкретному объекту или функции в программе, исходный текст которой размещен в нескольких файлах (модулях). Все глобальные объекты имеют внешний вид компоновки. Файлы могут транслироваться отдельно. Такие файлы нуждаются во внешней компоновке. Для остальных объектов, которые находятся внутри файлов, используется внутренняя компоновка.
5 Ссылки
Ссылка – это еще одно имя существующего объекта.
Синтаксис определения ссылки следующий:
тип & имя_ссылки=инициализирующее_выражение;
где инициализирующее_выражение – это имя объекта, который уже имеет место в памяти, а тип – это тип этого объекта.
Например:
int x=20; //определена и проинициализирована переменная х
int &pх=х; // определена ссылка, значением которой является
// адрес переменной х
float g=5.5;//определена и проинициализирована переменная g.
float &pg=g; // определена ссылка, значением которой является
// адрес переменной g
В определении ссылки символ & не является частью типа, т.е. x или pх имеют тип int. Имя_ссылки определяет место расположения инициализирующего объекта.
Ссылка – это адрес объекта, поэтому сходна с указателем. Но у ссылки имеются существенные особенности.
1) Обращение к ссылке аналогично обращению к переменной, для доступа к содержимому ссылки не нужно выполнять операцию разыменования. Например, допустимо:
double f=5.5;// определена и проинициализирована переменная f.
double &pf=f; //определена ссылка pf c адресом f
double *fp1=&f; //определен указатель fp1 c адресом f.
f=2.5; //переменной f присвоено значение 2.5
pf=1.5; //переменной f присвоено значение 1.5
*fp1=10.5; //переменной f присвоено значение 10.5
2) Размер ссылки – это размер переменной, связанной со ссылкой при инициализации, а размер указателя, в общем случае 4 байта.
int n1=sizeof(pf); // n1=8 (тип double)
int n2=sizeof(fp1);// n2=4(2 байта-сегмент, байта-смещение)
3) При определении ссылки ее необходимо инициализировать.
int x=100;
Int &хref; // ошибка!!
int &хref=х;// правильно!!
4) Нельзя переопределить ссылку, т.е. изменить адрес переменной, на которую она ссылается.
int x1=50;
хref=х1; // переменной х присвоится значение х1.
// ссылка хref будет по-прежнему ссылаться х .
Cсылки – это не настоящие объекты, поэтому существуют ограничения при определении и использовании ссылок:
Ссылка не может иметь тип void.
Ссылку нельзя создать с помощью операции new, т.е. для ссылки нельзя выделить новый участок памяти.
Нельзя определить ссылку на другую ссылку и указатель на ссылку.
Нельзя создать массив ссылок.
В определении ссылки можно использовать модификатор const, т.е. допустимо определить ссылку на константу. Например:
double d=2.728282; // определили переменную
const double &ref_d=d; //определили ссылку на константу
d=0.1;// допустимо
ref_f=0.2; // ошибка!!
При определении ссылок обязательна инициализация, но при описании ссылки инициализация необязательна в таких случаях:
1) при описании внешних ссылок.
float & ref1; // ошибка!! нет инициализации ссылки
extern float &ref2; //допустимо! Инициализируется в другом блоке
2) в спецификации формальных параметров и при описании типа функции.
3) при описании ссылок на компоненты класса.
При использовании ссылки в качестве формального параметра обеспечивается доступ из тела функции к соответствующему фактическому параметру, т.е. к участку памяти, выделенному для фактического параметра. Ссылка обеспечивает те же возможности, что и параметр-указатель, но при этом не нужно применять операцию разыменования. В этом случае фактический параметр является обычной переменной, а не адресом, как для параметра-указателя.
Пример.
#include<stdio.h>
int f1_ref(int &a, int &b) {return a+b;}
