Передача аргументом структуры 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Передача аргументом структуры



Над структурами допустимы такие "операции":

  1. копирование;
  2. присваивания;
  3. взятие адреса;
  4. доступ к ее членов;
  5. инициализация.

!Невозможно структуры сравнивать.

Копированию соответствует передача структуры аргументом в функции.

Присваиванию отвечает возвращения структуры как результата функции.

Существует три подхода к передаче структур в функцию и возврат из нее:

  1. передача ее членов в отдельности;
  2. передача структуры вполне;
  3. передача указателя на структуру.
Пример 10: объекты, для которых будем выполнять операции со структурами. объекты типа__________________________________________________________________ "Точка" | "прямоугольник"__________________|_______________________________________________ Struct Point | Struct Rect {Int x; | {struct point pt1; / * левый верхний угол * / int y; | struct point pt2; / * правый нижний угол * / }; |};__________________|_______________________________________________

С помощью объектов этих типов напишем несколько функций.

Пример 11: формирование точки по ее компонентам. struct point makepoint (int x, int y) {Struct point temp; temp.x = x; temp.y = y; return temp; }

 

 

Определим с помощью этой функции объект "экран" (как прямоугольник размером с экран монитор).


i объект "середина экрана" (как точку с координатами центра экрана).

Пример 12: формирование объектов "экран" i "середина экрана". # Define MAXX 639# Define MAXY 349# Define MINX 0# Define MINY 0...struct rect screen; / * объект "экран" * / struct point middle; / * объект "середина экрана" * / struct point makepoint (int, int);/ * Создание левого верхнего угла объекта "экран": * /screen.pt1 = makepoint (MINX, MINY);/ * Создание правого нижнего угла объекта "экран": * /screen.pt2 = makepoint (MAXX, MAXY);/ * Создание объекта "середина экрана: * /middle = makepoint ((screen.pt1.x + screen.pt2.x) / 2, (Screen.pt1.y + screen.pt2.y) / 2); Пример 13: добавление точек. Struct Point addp (struct point p1, struct point p2) {P1.x + = p2.x; p1.x + = p2.x; return p1; }

Для формирования результата используется структура, переданная первым аргументом. Это допустимо, так как структура передается в функцию копией. Поэтому в отличии от makepoint здесь не нужна локальная переменная типа struct для формирования результата.

Пример 14: принадлежит ли точка p прямоугольнике r? pt_in_rect (struct point p, struct rect r) {Return px> = r.pt1.x & & px <= r.pt2.x & & py> = r.pt1.y & & py <= r.pt2.y; } / * Результат не является 0, если точка p принадлежит прямоугольнику r, иначе результат есть 0 * /

Указатели на структуры ничем не отличаются от указателей на обычные переменные.

Пример 15: указатели на структуры struct point * ps; / * указатель на структуру * /struct point t; struct point makepoint (int, int);t = struct point makepoint (15, 25); ps = &t;/ * * Ps - это структура t (* Ps). X = 15 (* Ps). Y = 25 * /printf ("Это t: (% d,% d)", (* ps). x, (* ps). y);

Скобки в этом примере нужны потому, что prio (.)> prio (*).

Оператор ->:

Синтаксис:

<Указатель на структуру> -> <имя члена структуры>

Семантика:

Если р - указатель на структуру, то г -> <член структуры> - это ее член.

Свойства оператора ->:

  • бинарный;
  • iнфиксний;
  • наивысший приоритет;
  • лiвоасоцiативний.
Пример 16: эквивалент примера 15....printf ("Это t: (% d,% d)", ps -> x, ps-> y); Пример 17: struct rect r, * pr;pr = &r; / * Эквивалентные: * / 1) r.pt1.x 2) pr-> pt1.x3) (r.pt1). X4) (pr-> pt1). X Пример 18: передача структуры аргументом по ссылке. main () {Struct point p; struct point makepoint (int, int); void put (struct point *); p = makepoint (10, 12); put (& p); } void put (struct point *) {Print ("x =% d, y =% d", p -> x, p -> y); / * Или print ("x =% d, y =% d", (* p). X, (* p). Y) * / } Пример 19: Использование нескольких операторов для работысо структурами с учетом приоритета операторов. struct {Int len; / * длина строки * / char str; / * строка * / } * P;+ + P-> len; / * len + +, а не p + + * /+ + (P-> len); / * эквивалентна * / (+ + P) -> len; / * 1) + + p; (перейти к следующей строке) * / / * 2). Len; (взять его длину) * /(P ++)-> len; / * 1). Len; (взять длину строки) * / / * 2) p + +; (перейти к следующей строке) * /p + + -> len; / * эквивалентна * / * P-> str; / * * p-> str (то, на что ссылается str - str [0]) * /* (P-> str); / * эквивалентна * / * P-> str + +; / * 1) * p-> str (то, на что ссылается str - str [0]) * / / * 2) str + +; / * (Перейти к следующему элементу - str [1]) * /(* P-> str) + +; / * 1) * p-> str (то, на что ссылается str - str [0]) * / / * 2) увеличение на 1 кода символа, который содержится в str [0]) * /* P + + -> str; / * 1) * p-> str (то, на что ссылается str - str [0]) * / / * 2) p + +; (перейти к следующей строке) * /

Аргументы командной строки

В командной строке исполняемого файла, можно передать аргументы, записывая их через пробел. Эти аргументы, которые записаны в командной строке, являются фактическими для функции main. Формальные аргументы для функции main создаются ОС. Поэтому в функции main нужно уметь их обрабатывать.

Аргументы (формальные) функции main:

  • argc (argument count): количество аргументов командной строки;
  • argv (argument vector): указатель на массив строк, содержащий самые аргументы.
Пример 20: программа echo для печати аргументов командной строки,которые между собой разделены символом _ (чтобы отличить строку результатаот входного). Если командная строка содержит C:> echo Главная функция то программа echo напечатает C:> echo_Головна_функцiя

Для программы echo операционная система построит такие фактические аргументы:

  • argv [0] всегда именем исполняемого файла.
  • argv [argc] должно быть пустым указателем (NULL).
Пример 21: текст программы echo (вариант 1). # include main (int argc, char * argv []) {Int i; for (i = 0; i <argc; i + +) printf ("% s% s", argv [i], (i <argc-1)? "_":""); printf ("\ n"); return 0; } Пример 22: текст программы echo (вариант 2). # include main (int argc, char * argv []) {While (- argc> = 0) printf ("% s% s", + + + argv, (argc> 1)? "_":""); printf ("\ n"); return 0; }

! Аргументы командной строки являются строками.

 

 



Поделиться:


Последнее изменение этой страницы: 2017-01-27; просмотров: 267; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.117.109 (0.005 с.)