Обмен технологиями

Язык Си — структура

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Определите и используйте структуры

1.1 Обзор

Типы данных, которые мы видели раньше, такие как int, float, char и т. д., просто используются в программах. Если мы хотим создать некоторые сложные данные в соответствии с нашими собственными потребностями, нам нужно использовать структуры.

Например, номер ученика, имя, пол, возраст и т. д. принадлежат одному и тому же ученику, но эти переменные относятся к разным типам. Если вы просто используете разные переменные для простых определений, сложно отразить взаимосвязь между ними. . Внутренняя связь. Затем мы создаем переменную, которая может объединять эти данные, и помещаем их в переменную, чтобы ее было намного проще использовать. Это изучение структуры;

  1. 结构体类型:
  2.         struct Student
  3.         {
  4.               int num;//学号为整形;
  5.               char name[20];//姓名为字符串;
  6.               char sex;//性别为字符型;
  7.               int age;//年龄为整形
  8.               float score;//成绩为浮点型
  9. char addr[30];//地址为字符型;
  10. }

в:

struct Student — тип структуры;

struct — ключевое слово, объявляющее тип структуры.

Student — название структуры, чтобы отличать ее от других структур;

Фигурные скобки содержат элементы структуры. Группа вместе называется списком членов, и ее имя соответствует именам переменных;

Примечание. Типы структур могут иметь несколько типов, например: структура Student; структура Worker;

Члены структуры также могут быть типом другой структуры;

Дата структуры

{        

целочисленный месяц;

инт день;

целый год;

};

структура Студент

{

целочисленное число;

имя символа[20];

секс на улице;

инт возраст;

структура Дата день рождения;

символьный адрес[30];

}

1.2 Определение структурных переменных

Ранее мы определяли только тип структуры, который эквивалентен модели, и не определяли переменные. Далее мы определяем переменные структуры и сохраняем в них определенные данные, 3 метода;

Способ 1: сначала объявите тип структуры, а затем определите переменные структуры.

На основе предыдущего типа структуры struct Student определите переменные структуры;

структура Студент студент1,студент2;

Этот метод аналогичен int a,b; единственным обязательным условием является наличие типа структуры и определение структурной переменной на основе этого типа.

    Способ 2. Определите переменные при объявлении типа

форма:

имя структуры структуры

                {

Список пользователей;

}Список имен переменных;

Пример:

структура Студент
                {
целочисленное число;
имя символа[20];
секс на улице;
инт возраст;
плавающая оценка;
символьный адрес[30];
}студент1,студент2;

      Способ 3. Непосредственно определить переменные типа структуры без указания имени типа.

форма:

структура

                        {

Переменные-члены;

}Список имен переменных;

Это безымянный тип структуры, который обычно не используется;

Примечание: 1. Имена членов в переменных структуры могут совпадать с именами переменных в программе;

2. Члены структурных переменных могут использоваться отдельно; их статус и функция эквивалентны обычным переменным;

1.3 Инициализация и обращение к структурным переменным

Инициализируйте переменные структуры при их определении;

      Пример:Поместите информацию о студенте (включая номер студента, имя, пол, адрес) в структурную переменную, а затем выведите информацию о студенте;

  1. #include <stdio.h>
  2. int main()
  3. {
  4. struct Student
  5. {
  6. int num;
  7. char name[20];
  8. char sex;
  9. char addr[20];
  10. }student1 = {101,"Li li",'M',"123XiAn"};
  11. printf("NO:%d,nname:%snssex:%cnaddress:%sn",student1.num,student1.name,student1.sex,student1.addr);
  12. return 0;

Анализ результатов:

При определении структурной переменной, кстати, инициализируйте ее члены. Список инициализации представляет собой ряд констант, заключенных в фигурные скобки. Эти константы являются членами, присвоенными структурной переменной одновременно. Примечание. Это инициализация структурной переменной, а не инициализация. Инициализация типа тела.

Значение члена в структурной переменной, ссылочный метод:

Имя структурной переменной. Имя члена

имя_студента1

      Для членов структуры, принадлежащих к другому типу структуры, элементы самого низкого уровня должны быть найдены уровень за уровнем. Например, упомянутая выше структура Student содержит структуру Date Birthday;

День рождения студента.месяц

Однотипные структуры могут быть присвоены друг другу:студент1= студент2;

        Пример:Введите идентификатор учащегося, имя и оценки двух учащихся и выведите идентификатор учащегося, имя и оценку учащегося с более высокими оценками;

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. int main()
  4. {
  5. struct Student
  6. {
  7. int num;
  8. char name[20];
  9. float score;
  10. }student1,student2;
  11. scanf("%d%s%f", &student1.num, student1.name, &student1.score);
  12. scanf("%d%s%f", &student2.num, student2.name, &student2.score);
  13. printf("The higher score is:n");
  14. if (student1.score > student2.score)
  15. {
  16. printf("%d %s %6.2fn", student1.num, student1.name, student1.score);
  17. }
  18. else if (student1.score < student2.score)
  19. {
  20. printf("%d %s %6.2fn", student2.num, student2.name, student2.score);
  21. }
  22. else
  23. {
  24. printf("%d %s %6.2fn", student1.num, student1.name, student1.score);
  25. printf("%d %s %6.2fn", student2.num, student2.name, student2.score);
  26. }
  27. }

При использовании функции scanf для ввода переменных структуры их необходимо вводить отдельно. Вы не можете использовать имя переменной структуры в функции scanf для ввода значений всех членов одновременно. Обратите внимание, что функция scanf не имеет знака & перед. имени студента1.имя, поскольку имя массива изначально представляет собой адрес «получил».

2. Используйте массив структур

2.1 Определить массив структур

Когда мы ранее определяли переменные структуры, мы определяли их одну за другой. Однако, если в операции должна участвовать группа связанных данных, очевидно, необходимо использовать такие данные, как информация 10 студентов. — это массив структур, каждый элемент массива структур является структурой.

Например: Есть три кандидата, и каждый избиратель может проголосовать только за одного человека. Требуется написать программу для подсчета голосов. Сначала введите имя кандидата и, наконец, отобразите результат голосования каждого человека.

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <string.h>
  4. struct Person
  5. {
  6. char name[20];
  7. int count;
  8. }leader[3] = { "wang", 0, "zhang", 0, "li", 0 };
  9. int main()
  10. {
  11. int i, j;
  12. char lead_name[20];
  13. for (i = 0; i < 10; i++)
  14. {
  15. scanf("%s", lead_name);
  16. for (j = 0; j < 3; j++)
  17. {
  18. if (strcmp(lead_name, leader[j].name) == 0)
  19. leader[j].count++;
  20. }
  21. }
  22. printf("nResultn");
  23. for (i = 0; i < 3; i++)
  24. {
  25. printf("name:%s,count:%dn", leader[i].name, leader[i].count);
  26. }
  27. return 0;
  28. }

Определим общую форму массива структур:

        имя структуры структуры

        {

список переменных

} Имя массива [длина массива];

или

Сначала объявите тип структуры, например: struct Student, а затем определите массив структур;

        Имя массива типа структуры [длина массива];

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

      ={Список начальных значений};     

2.2 Использование массива структур

        Пример:Имеется информация о n студентах (включая идентификатор студента, имя и оценки), и необходимо вывести информацию о каждом студенте в порядке оценок;

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <string.h>
  4. struct Student
  5. {
  6. int num;
  7. char name[20];
  8. float score;
  9. };
  10. int main()
  11. {
  12. struct Student stu[5] = { 1001, "Wangwei", 98.25, 1002, "Liuliu", 91, 1003, "Zhangli", 98, 1004, "Xiaozhao", 85, 1005, "Baibai", 94 };
  13. struct Student temp;
  14. printf("The order id:n");
  15. int i, j,k;
  16. for (i = 0; i < 4; i++)
  17. {
  18. k = i;
  19. for (j = i + 1; j < 5; j++)
  20. {
  21. if (stu[j].score>stu[k].score)
  22. {
  23. k = j;
  24. }
  25. }
  26. temp = stu[k];
  27. stu[k] = stu[i];
  28. stu[i] = temp;
  29. }
  30. for (i = 0; i < 5; i++)
  31. {
  32. printf("%d %s %5.2f", stu[i].num, stu[i].name, stu[i].score);
  33. printf("n");
  34. }
  35. return 0;
  36. }

3. Указатель структуры

3.1 Указатели на структурные переменные

Так называемый указатель структуры — это указатель на структурную переменную. Начальный адрес структурной переменной — это указатель на структурную переменную.

Переменная-указатель, указывающая на объект структуры, может указывать либо на переменную структуры, либо на элемент массива структур. Базовый тип переменной-указателя должен быть таким же, как тип переменной структуры.

Например: struct Student * pt;

Пример:Вывести информацию о членах структурной переменной через переменную-указатель, указывающую на структурную переменную;

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <string.h>
  4. struct Student
  5. {
  6. long num;
  7. char name[20];
  8. char sex;
  9. float score;
  10. };
  11. int main()
  12. {
  13. struct Student stu1;
  14. struct Student *pt;
  15. pt = &stu1;
  16. stu1.num = 10001;
  17. strcpy(stu1.name, "Lili");
  18. stu1.sex = 'M';
  19. stu1.score = 96.5;
  20. printf("No:%dnname:%snsex:%cnscore:%5.1fn", stu1.num, stu1.name, stu1.sex, stu1.score);
  21. printf("n");
  22. printf("No:%dnname:%snsex:%cnscore:%5.1fn", (*pt).num, (*pt).name, (*pt).sex, (*pt).score);
  23. printf("n");
  24. printf("No:%dnname:%snsex:%cnscore:%5.1fn", pt->num, pt->name, pt->sex, pt->score);
  25. return 0;
  26. }

Анализ результатов:

В этой функции первая функция printf обращается к членам через имя структурной переменной stu1;

Вторая функция printf обращается к своим членам через переменную-указатель, указывающую на структурную переменную (*pt) представляет собой структурную переменную, на которую указывает, а (*pt).num представляет указанный элемент структуры.

Кроме того, в языке C допускается замена (*pt).num на pt-&gt;num;

3.2 Указатель на массив структур

Переменные указателя можно использовать для указания на элементы массива структур.

Пример:В структурный массив помещена информация о трех студентах, и информация о студенте должна быть выведена;

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <string.h>
  4. struct Student
  5. {
  6. long num;
  7. char name[20];
  8. char sex;
  9. float score;
  10. };
  11. int main()
  12. {
  13. struct Student stu[3] = { 1001, "wangle", 'M', 95, 1002, "chengcai", 'M', 99.9, 1003, "shangmin", 'F', 85.2 };
  14. struct Student *pt;
  15. printf("No. name sex scoren");
  16. for (pt = stu; pt < stu + 3; pt++)
  17. {
  18. printf("%d %s %c %5.2fn", pt->num, pt->name, pt->sex, pt->score);
  19. }
  20. return 0;
  21. }

В программе pt является указателем на структурную переменную типа struct Student. Он используется для указания на структурную переменную, а не на определенный член структуры. Имя недопустимо. структурная переменная, а другая — переменная-член структуры. p++, значение p увеличивает длину структуры.

3.3. Используйте структурные переменные и указатели для структурирования переменных в качестве параметров функции.

Существует три способа передать значение структурной переменной в функцию;

1. Использовать в качестве параметров члены переменных структуры. Этот метод эквивалентен передаче обычных переменных. Следует отметить, что формальные и фактические параметры (члены структуры) имеют один и тот же тип;

2. Используйте структурные переменные в качестве фактических параметров. Когда структурная переменная используется в качестве фактического параметра, она также передается по значению. Все содержимое ячейки памяти, занимаемой структурной переменной, передается формальному параметру. Формальный параметр также должен быть структурной переменной.

3. Используйте указатель на структурную переменную (массив) в качестве фактического параметра, чтобы передать адрес структурной переменной (массив) формальному параметру.

Пример:

Имеется n структур, включающих идентификаторы студентов, имена и оценки по 3 курсам. Требуется вывести информацию о студентах с наивысшими средними оценками (включая идентификаторы студентов, имена, оценки по 3 курсам и средние оценки). .

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <string.h>
  4. void print(struct Student stud);
  5. struct Student Max(struct Student stu[]);
  6. void input(struct Student stu[]);
  7. struct Student
  8. {
  9. int num;
  10. char name[20];
  11. float score[3];
  12. float aver;
  13. };
  14. int main()
  15. {
  16. struct Student stu[3], *pt;
  17. pt = stu;
  18. input(pt);
  19. print(Max(pt));
  20. return 0;
  21. }
  22. void input(struct Student stu[])
  23. {
  24. int i;
  25. printf("请输入各学生的信息:学号、姓名、3门成绩:n");
  26. for (i = 0; i < 3;i++)
  27. {
  28. scanf("%d%s%f%f%f", &stu[i].num, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
  29. stu[i].aver = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3.0;
  30. }
  31. }
  32. struct Student Max(struct Student stu[])
  33. {
  34. int i, m = 0;
  35. for (i = 0; i < 3; i++)
  36. {
  37. if (stu[i].aver > stu[m].aver)
  38. m = i;
  39. }
  40. return stu[m];
  41. }
  42. void print(struct Student stud)
  43. {
  44. printf("成绩最好的学生是:n");
  45. printf("学号:%d 姓名:%s 三门课程:%5.2f %5.2f %5.2f平均成绩:%5.2fn", stud.num, stud.name, stud.score[0], stud.score[1], stud.score[2], stud.aver);
  46. }

1. При вызове функции ввода фактическим параметром является переменная-указатель pt, а формальным параметром является массив структур. Передается начальный адрес элемента структуры, и функция не имеет возвращаемого значения;

2. При вызове функции Max фактическим параметром является переменная-указатель pt, формальным параметром является массив структур, передается начальный адрес элемента структуры, а возвращаемым значением функции являются данные типа структуры.

3. При вызове функции печати фактическими параметрами являются структурные переменные (элементы массива структур), а формальными параметрами являются структурные переменные. Передается значение каждого члена структурной переменной, и функция не имеет возвращаемого значения.

4. Связанный список

4.1 Обзор

Связанный список — это общая структура данных, которая представляет собой структуру для динамического распределения памяти.

При хранении данных в массиве длина массива (несколько массивов) должна быть определена заранее. Если в некоторых классах 100 учеников, а в некоторых классах 30 учеников, то если один и тот же массив используется для хранения данных учащихся в разных классах, это означает, что один и тот же массив используется для хранения данных учащихся в разных классах. должен быть определен массив длиной 100, но это часто приводит к пустой трате ресурсов. Связанный список не имеет таких недостатков. Он открывает блоки памяти по мере необходимости.

Связанный список имеет переменную «указатель головы», представленную на рисунке головой, которая хранит адрес, указывающий на элемент. Каждый элемент в связанном списке называется «узлом», и каждый узел должен включать две части:

1. Фактические данные, необходимые пользователям;

2. Адрес следующего элемента;

Видно, что адреса каждого элемента связанного списка в памяти могут быть прерывистыми. Чтобы найти определенный элемент, необходимо сначала найти предыдущий элемент, а следующий элемент можно найти по адресу предыдущего элемента. . Если «указатель головы» не указан, весь связанный список недоступен.

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

структура Студент

        {

целочисленное число;

оценка int;

структура Студент *следующий;

        }

Среди них num и Score используются для хранения пользовательских данных, а next — для хранения адреса следующего узла.

4.2 Статический связанный список

Случай:

Создать статический связанный список, состоящий из узлов с данными трех студентов, и потребовать вывода данных каждого узла;

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. struct Student
  4. {
  5. int num;
  6. float score;
  7. struct Student * next;
  8. };
  9. int main()
  10. {
  11. struct Student a, b, c, *head, *p;
  12. a.num = 1001; a.score = 85.5;
  13. b.num = 1002; b.score = 95.5;
  14. c.num = 1003; c.score = 84.5;
  15. head = &a;
  16. a.next = &b;
  17. b.next = &c;
  18. c.next = NULL;
  19. p = head;
  20. do
  21. {
  22. printf("%d %5.2fn", p->num, p->score);
  23. p = p->next;
  24. } while (p != NULL);
  25. return 0;
  26. }

Например, создайте связанный список, чтобы head указывал на узел a, a.next указывал на узел b, b.next указывал на узел c, а c.next указывал на ноль. Это формирует связь связанного списка.

При выводе связанного списка вы должны сначала использовать p, указать p на a, а затем вывести данные в p=p-&gt;next, чтобы подготовить следующий узел к выводу.

4.3 Динамический связанный список

4.3.1 Динамическое распределение памяти

Прежде чем говорить о динамических связанных списках, давайте сначала познакомимся с динамическим распределением памяти.

Ранее мы говорили, что переменные делятся на глобальные переменные и локальные переменные. Глобальные переменные размещаются в статической области хранения памяти. Нестатически хранимые локальные переменные размещаются в динамической области хранения. Эта область памяти называется.куча

Кроме того, язык C также позволяет создавать области динамического выделения памяти для хранения некоторых временных данных. Эти данные открываются при необходимости и освобождаются, когда они не нужны. Эти данные временно сохраняются в специальной свободной области хранения.куча

Динамическое распределение памяти достигается с помощью функций, предоставляемых системой: функций malloc, calloc, free и realloc.

1. Используйте функцию malloc, чтобы открыть динамическую область хранения.

функция: void *malloc (размер беззнакового целого числа);

Функция:

        Выделите непрерывное пространство длиной (единица измерения: байты) в области динамического хранения памяти.

возвращаемое значение:

Адрес первого выделенного байта; этот адрес не имеет типа, это простой адрес;

2. Используйте функцию calloc, чтобы открыть область динамического хранения.

функция:void * calloc(беззнаковое n,беззнаковый размер);

Функция:

Выделите n байт непрерывного пространства длиной size в области динамического хранения памяти. Это пространство достаточно велико, чтобы сохранить массив;

Используйте функцию calloc, чтобы открыть динамическое пространство для хранения одномерного массива, n — количество элементов массива, а размер — длина элемента.

возвращаемое значение:

Адрес первого выделенного байта; этот адрес не имеет типа, это простой адрес;

3. Используйте функцию realloc, чтобы перераспределить область динамического хранения.

функция:void * realloc(void *p ,unsigned int size);

Функция:

Перераспределить выделенную динамическую память.

Используйте функцию callloc, чтобы изменить размер динамического пространства, на которое указывает p, на size. Значение p остается неизменным;

возвращаемое значение:

Адрес первого байта динамической памяти после обновления по сути является адресом, на который указывает p.

4. Используйте бесплатную функцию, чтобы освободить область динамического хранения.

функция: void free(void *p);

Функция:

Освободите динамическое пространство, на которое указывает переменная-указатель p, чтобы эта часть пространства могла использоваться другими переменными.

p — возвращаемое значение, полученное в результате последнего вызова функций malloc и calloc;

возвращаемое значение:

никто;

Примечание: все объявления четырех вышеупомянутых функций находятся в заголовочном файле stdlib.h.

Тип указателя void:

Возвращаемые значения вышеуказанных функций malloc и calloc имеют тип void *, что означает, что они не указывают на какой-либо тип данных, но не понимают это как указание на какой-либо тип, но указывают на пустой тип. или не указывает на данные определенного типа.

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

Например:

целое число *p;

p=(целое*)маллок(100);

Случай:

Создайте динамические данные, введите оценки 5 учащихся и используйте функцию, чтобы проверить, есть ли учащиеся с баллами менее 60, и выведите неквалифицированные оценки;

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int main()
  5. {
  6. void check(int * p);
  7. int *p1, i;
  8. p1 = (int *)malloc(5 * sizeof(int));
  9. for (i = 0; i < 5; i++)
  10. {
  11. scanf("%d", p1 + i);
  12. }
  13. check(p1);
  14. return 0;
  15. }
  16. void check(int * p)
  17. {
  18. int i;
  19. printf("they are fail:n");
  20. for (i = 0; i < 5; i++)
  21. {
  22. if (*(p+i) < 60)
  23. printf("%d ", *(p + i));
  24. }
  25. }

результат операции:

Анализ результатов:

В программе не определен массив, но открывается динамическая свободная область размещения для использования в качестве массива.

В функции malloc для выделения динамического пространства напрямую не передается конкретное значение. Вместо этого для расчета количества байтов системного целого числа используется sizeof, а затем создаются 5 элементов. Используйте p, чтобы указать на адрес первого байта и преобразовать его в тип int, а p+1 указывает на следующий элемент.

4.3.2 Создание динамического связанного списка

Напишите функцию для создания динамического связанного списка с данными для 4 студентов.

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define LEN sizeof(struct Student)
  5. struct Student
  6. {
  7. long num;
  8. float score;
  9. struct Student * next;
  10. };
  11. int n;
  12. struct Student * creat(void)
  13. {
  14. struct Student * head, *p1, *p2;
  15. n = 0; p1 = p2 = malloc(LEN);
  16. scanf("%ld%f", &p1->num, &p1->score);
  17. head = NULL;
  18. while (p1->num != 0)
  19. {
  20. n = n + 1;
  21. if (n == 1)
  22. head = p1;
  23. else p2->next = p1;
  24. p2 = p1;
  25. p1 = (struct Student *)malloc(LEN);
  26. scanf("%ld%f", &p1->num, &p1->score);
  27. }
  28. p2->next = NULL;
  29. return (head);
  30. }
  31. int main()
  32. {
  33. struct Student * pt;
  34. pt = creat();
  35. printf("n num:%ld score:%5.2fn", pt->num, pt->score);
  36. return 0;
  37. }

результат операции:

Анализ результатов: Чтобы создать динамический связанный список, сначала указываются три указателя структуры, а затем используется функция malloc для создания узла. Все три указателя структуры указывают на этот узел, а затем p1 использует функцию malloc для создания узла и p2 Next. указывает на созданный узел. После указания на p2=p1, p1 создает p2. Следующий указывает на созданный узел, p2=p1....до тех пор, пока значение элемента в p1 не станет равным 0. Следующий из p2 не указывает на созданный узел. вновь созданный узел. Узел указывает на NULL. Таким образом, создается динамический связанный список.

Ввод и вывод динамического связанного списка:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define LEN sizeof(struct Student)
  5. struct Student
  6. {
  7. long num;
  8. float score;
  9. struct Student * next;
  10. };
  11. int n;
  12. struct Student * creat(void)
  13. {
  14. struct Student * head, *p1, *p2;
  15. head = NULL;
  16. n = 0;
  17. p2 = p1 = malloc(LEN);
  18. scanf("%ld%f", &p1->num, &p1->score);
  19. while (p1->num != 0)
  20. {
  21. n = n + 1;
  22. if (n == 1)
  23. head = p1;
  24. else
  25. p2->next = p1;
  26. p2 = p1;
  27. p1 = malloc(LEN);
  28. scanf("%ld %f", &p1->num, &p1->score);
  29. }
  30. p2->next = NULL;
  31. return head;
  32. }
  33. void print(struct Student * p)
  34. {
  35. do
  36. {
  37. printf("%ld %5.2fn", p->num ,p->score);
  38. p=p->next;
  39. } while (p->num != NULL);
  40. }
  41. int main(void)
  42. {
  43. struct Student * pt;
  44. pt = creat();
  45. print(pt);
  46. return 0;
  47. }

результат операции:

5. Тип соединения

5.1 Обзор

Иногда вам нужно хранить переменные разных типов в единице памяти. Например, поместите целочисленные переменные, символьные переменные и переменные с плавающей запятой в единицу памяти, начинающуюся с одного и того же адреса. Это позволяет нескольким переменным совместно использовать одну и ту же единицу памяти. Участок структуры памяти называется «объединением».

Определим общую форму союза:

название профсоюза

        {

Список пользователей;

}Список переменных;

Например:

Данные союза

        {

целочисленный я;

символ ч;

плавающая ф;

}а,б,в;

Длина памяти, занимаемая структурной переменной, представляет собой сумму длин памяти, занимаемых каждым членом, а длина памяти, занимаемая объединением, — это длина самого длинного члена.

5.2 Котировки

Можно ссылаться только на переменные объединения, которые были определены заранее. Обратите внимание, что мы ссылаемся не на переменные объединения, а на члены указанных переменных объединения.

ai относится к целочисленной переменной в переменной объединения;

a.ch относится к символьной переменной в переменной объединения;

af относится к реальной переменной в переменной объединения;

5.3 Особенности

1. Сегмент памяти может использоваться для хранения нескольких различных типов членов, но в каждый момент времени может храниться только один из них, а не несколько одновременно.

2. Переменные объединения можно инициализировать, но в таблице инициализации может быть только одна константа.

3. Членом переменной-объединения является член, назначенный в последний раз, а предыдущая исходная переменная перезаписывается и заменяется.

4. Адрес переменной-объединения совпадает с адресом ее членов.

5. Вы не можете присвоить значение имени объединенной переменной или попытаться ссылаться на имя переменной, чтобы получить значение.

6. Тип перечисления

Если некоторые переменные имеют лишь несколько возможных значений, их можно определить как типы перечисления, так называемое перечисление заключается в перечислении возможных значений одно за другим;

Например, объявление типа перечисления начинается с enum;

eunm Будний день{вс,пн,вт,ср,чт,пт,сб};

Приведенное выше объявляет тип перечисления enum Weekday. Этот тип затем можно использовать для определения переменных.

enum Будний день рабочий день,выходной;

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

Общая форма объявления типа перечисления:

enum [имя перечисления] {список элементов перечисления};

Пример:

В кармане 5 видов шаров: красный, желтый, синий, белый и черный. Каждый раз вынимайте из мешка по 3 шара. Спросите, какими способами можно получить 3 шара разного цвета и расставьте их;

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. int main()
  4. {
  5. enum Color {red,yellow,bule,white,black};
  6. enum Color i, j, k, pri;
  7. int n, loop;
  8. n = 0;
  9. for (i = red; i <= black; i++)
  10. for (j = red; j <= black; j++)
  11. if (i != j)
  12. {
  13. for (k = red; k <= black; k++)
  14. if ((k != i) && (k != j))
  15. {
  16. n++;
  17. printf("%d ", n);
  18. for (loop = 1; loop <= 3; loop++)
  19. {
  20. switch (loop)
  21. {
  22. case 1:pri = i; break;
  23. case 2:pri = j; break;
  24. case 3:pri = k; break;
  25. default:break;
  26. }
  27. switch (pri)
  28. {
  29. case red:printf("%s ", "red"); break;
  30. case yellow:printf("%s ", "yellow"); break;
  31. case bule:printf("%s ", "bule"); break;
  32. case white:printf("%s ", "white"); break;
  33. case black:printf("%s ", "black"); break;
  34. default:break;
  35. }
  36. }
  37. printf("n");
  38. }
  39. }
  40. printf("n total:%dn", n);
  41. return 0;
  42. }

результат операции:

7. Используйте typedef для объявления нового имени типа.

Используйте typedef, чтобы указать новое имя типа для замены существующего имени типа;

1. Просто замените исходное имя типа новым именем типа.

Например:

typedef int Целое число;

typedef float Действительное число;

Таким образом, следующие две строки эквивалентны:

int i, j;——— Целое число i, j;

2. Назовите имя простого типа вместо метода представления сложного типа.

  Назовите новое имя типа, чтобы представить тип структуры:

typedef структура

        {

инт мун;

                ......

} Данные;

Затем используйте новое имя типа Data для определения переменной;

Дата рождения;

Данные * р;

      Назовите новое имя типа вместо типа массива:

typedef int Num[100];

Номер а;

      Назовите новое имя типа, которое будет представлять тип указателя.

typedef char * Строка;

Строка p,a[10];

      Назовите новое имя типа, которое будет представлять указатель на функцию;

typedef int (* Указатель)();

Указатель p1,p2;

           Описание: В соответствии со способом определения переменных замените имя переменной новым именем типа и добавьте typedef в начале, чтобы объявить, что новое имя типа представляет исходный тип.

typetef только указывает новое имя типа для существующего типа, но не создает новый тип.

typetef и #define имеют внешнее сходство.

typedef int Количество

#define Count int

Их функция — использовать Count вместо int, но на самом деле они разные. #define обрабатывается на прекомпиляции, его можно использовать только как простую замену строки, а typedef обрабатывается на этапе компиляции. На самом деле это не простая замена. Вместо этого генерируется новое имя типа и определяется переменная.