Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП - ПОИТ (Бахтизин) часть 1 редакт.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.76 Mб
Скачать

8.6. Передача функциям структурных переменных

В некоторых случаях приходится передавать функциям в качестве параметров отдельные поля структур или даже структуры целиком. Язык Си предоставляет программисту несколько способов решения этой задачи.

Например, имеется следующая структура:

struct base

{

int n;

char name[20];

float cost;

int quant;

char note[100];

} m1;

и пусть f1(), f2(), f3() – некоторые функции. Тогда члены этой структуры передаются этим функциям следующим образом:

f1(m1.n); // функции f1 передаётся значение n

f2(m1.name); // функции f1 передаётся адрес name

f3(m1.name[i]); // функции f1 передаётся значение

// i-того элемента в массиве name

Чтобы передать адреса членов этой структуры функции, можно написать следующее:

f1(&m1.n); // функции f1 передаётся адрес n

f2(m1.name); // функции f1 передаётся адрес name

f3(&m1.name[i]); // функции f1 передаётся адрес

// i-того элемента в массиве name

Для того чтобы использовать структурную переменную в качестве аргумента функции (если не нужно изменять значения, находящиеся в ней), следует использовать способ вызова по значению. Если же имеется необходимость в изменении значений, надо передавать не саму структурную переменную, а указатель на неё.

Например, нужно умножить 2 числа, которые являются элементами структуры. Это можно сделать несколькими способами:

  1. Передать функции в качестве параметров члены структуры:

mult(m1.cost, m1.quant); // функции mult передаются

// значения cost и quant

...

float mult(float cost, int quant) // объявление функции mult

{

return (cost * quant); // выполняется само умножение

}

  1. Передать функции в качестве параметра саму структуру:

mult(m1); // функции mult передаётся

// структурная переменная m1

...

float mult(struct base m1) // объявление функции mult

{

return (m1.cost * m1.quant); // выполняется само умножение

}

  1. Передать функции в качестве параметра указатель на структуру:

mult(&m1); // функции mult передаётся адрес

// структурной переменной m1

...

float mult(struct base *p) // объявление функции mult

{

return (p->cost * p->quant); // выполняется само умножение

}

Нужно помнить, что 3-й вариант выполняется намного быстрее, особенно, когда структуры довольно громоздкие.

Также необходимо помнить, что тип аргумента функции должен соответствовать типу параметра.

Точно таким же образом функции передаётся массив структур. Путём передачи непосредственно самого массива структур:

struct base mas[5]; // объявление массива структур,

// состоящего из 6-ти элементов

f1(mas); // передача функции f1 массива структур mas

f1(struct base mas[])

{

...

mas[i].n = 1;

...

}

Либо путём передачи функции указателя на массив структур:

f1(struct base *p)

{

...

(p + i)->n = 1; // Можно также p[i].n = 1

// или (*(p + i)).n = 1

...

}