Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Передача членов структур функциям. Передача целых структур функциям.
При передаче структур в функцию в качестве типа параметра неоходимо указвать имя структурного типа. void func(key A){printf("Слово %s встречается %d раз",A[i].word,A[i].count); } Передача масствов структур в функцию осуществляется как и передача обычных массивов. Пример. Ввести изфайлаinputfile.dat информацию числе вхожденийключевого слова в текст программы на С. Вывести полученную информацию в файл output.dat. #include #include struct key {// информация числе вхождений ключевого слова в текст программы на С char word[10];// ключевое слово int count;//число вхождений }; key* input(int* n, char* fileName){// ввод из файла //n - размер массива //fileName - имя файла // функция возвращает указатель на массив структур в динамической памяти key* A; FILE *fp; // открытие файла на чтение if ((fp = fopen(fileName, "r")) == NULL) { printf("Нельзя открыть %s\n", "inputfile.dat"); return NULL; } // ввод размера массива структур fscanf(fp,"%d",n); //выделение памяти под массив структур A=(key*)calloc(*n,sizeof(key)); // ввод значений for (int i=0;i<*n;i++){ fscanf(fp,"%s",&A[i].word); fscanf(fp,"%d",&A[i].count); } fclose(fp); return A; } void output(int n, key* A, char* fileName){// вывод в файл массива структур //n - размер массива //А - указатель на массив структур //fileName - имя файла FILE *fp; if ((fp = fopen("outputfile.dat", "w")) == NULL) { printf("Нельзя открыть %s\n", "outputfile.dat"); return; } // вывод значение for (int i=0;i< n;i++){ fprintf(fp,"%s ",A[i].word); fprintf(fp,"%d ",A[i].count); } fclose(fp); } void main() { key *A; //указатель на массив структур int n; // кол-во элементов A=input(&n,"inputfile.dat"); output(n,A,"outputfile.dat"); free(A); }
Указатели на структуры. Средство typedef. Формат указателя на структуру: struct имя_стуктурного_типа *имя_указательной_пременной; Доступ к элементам структурчерез указатели будет осуществляться следующим образом: (*имя_указательной_пременной).элемент или имя_указательной_пременной-> элемент Пример:
struct key *pts; // объявляем указатель на структуру key Обращение к элементe count структуры key может осуществляться следующим образом: (*pts).count или же pts->count. Средство typedef Кроме объявлений переменных различных типов, имеется возможность объявить типы. Это можно сделать двумя способами. Первый способ - указать имя тега при объявлении структуры, объединения или перечисления, а затем использовать это имя в объявлении переменных и функций в качестве ссылки на этот тег. Второй - использовать для объявления типа ключевое слово typedef. При объявлении с ключевым словом typedef идентификатор, стоящий на месте описываемого объекта, является именем вводимого в рассмотрение типа данных, и далее этот тип может быть использован для объявления переменных. Отметим, что любой тип может быть объявлен с использованием ключевого слова typedef, включая типы указателя, функции или массива. Имя с ключевым словом typedef для типов указателя, структуры, объединения может быть объявлено прежде чем эти типы будут определенны, но в пределах видимости объявителя. Примеры: typedef double (* MATH)(); /* MATH - новое имя типа, представляющее указатель на функцию, возвращающую значения типа double */ MATH cos; /* cos указатель на функцию, возвращающую значения типа double */ //Можно провести эквивалентное объявление double (* cos)(); typedef char FIO[40] // FIO - массив из сорока символов FIO person; //Переменная person - массив из сорока символов //Это эквивалентно объявлению char person[40]; При объявлении переменных и типов здесь были использованы имена типов (MATH FIO). Помимо этого, имена типов могут еще использоваться в трех случаях: в списке формальных параметров, в объявлении функций, в операциях приведения типов и в операции sizeof (операция приведения типа). Именами типов для основных типов, типов перечисления, структуры и смеси являются спецификаторы типов для этих типов. Имена типов для типов указателя массива и функции задаются при помощи абстрактных описателей следующим образом:
спецификатор-типа абстрактный-описатель; Абстрактный-описатель – это описатель без идентификатора, состоящий из одного или более модификаторов указателя, массива или функции. Модификатор указателя (*) всегда задается перед идентификатором в описателе, а модификаторы массива [] и функции () - после него. Таким образом, чтобы правильно интерпретировать абстрактный описатель, нужно начать интерпретацию с подразумеваемого идентификатора. Абстрактные описатели могут быть сложными. Скобки в сложных абстрактных описателе задают порядок интерпретации подобно тому, как это делалось при интерпретации сложных описателей в объявлениях.
|
||||||
Последнее изменение этой страницы: 2021-08-16; просмотров: 58; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.129.19 (0.006 с.) |