zoukankan      html  css  js  c++  java
  • 15-C语言结构体

    目录:

    一、大型软件开发

    二、头文件和static

    三、结构体

    四、联合

    五、枚举

    回到顶部

    一、大型软件开发

    将一个代码中的内容,拆分成多个文件,最后的可执行文件只要一个。

    操作步骤:

    1 原来只有一个文件main.c输入函数 输出函数 声明

    2 多人开发 将原文件拆成三个文件,分别为*.h、*c、main.c

    3 编译时

    1)分别编译不同的源文件,生成相应的目标文件

    gcc -c input.c

    gcc -c main.c

    2)可以将多个目标文件链接生成同一个可执行文件

    gcc input.o main.o  =>  a.out

    3)在main.c中,引入头文件

    4).h文件中的条件编译解决的是重复声明问题

    5)先xcode中,Compile Sources解决链接问题的根本

    总结:如果使用第三方代码,要做两件事情,导入.h文件,导入目标文件.o(库)

    main.c

     1 #include <stdio.h>
     2 #include "header.h"
     3 
     4 extern int g_num;
     5 int main(int argc, const char * argv[])
     6 {
     7     int i = 0;
     8     i = input();
     9     printf("i:%d
    ",i);
    10     printf("g_num:%d
    ",getNum());
    11     return 0;
    12 }

    header.h声明代码:

    1 #ifndef _______header_h
    2 #define _______header_h
    3 
    4 int input();
    5 int getNum();
    6 #endif

    input.c实现代码:

     1 #include <stdio.h>
     2 static int g_num = 10;//用static修饰只能在本文件中访问
     3 int input()
     4 {
     5     int i = 0;
     6     printf("输入一个数:
    ");
     7     scanf("%d",&i);
     8     return i;
     9 }
    10 int getNum()
    11 {
    12     return g_num;
    13 }

    回到顶部

    二、头文件和static

    1 以.h结尾的文件就是头文件

    2 未使用内存空间的内容都可以放到头文件中,声明变量可能有问题(因为开辟了存储空间),将要使用函数的声明放在头文件中,方便使用函数,如果函数声明变更,则只需要修改头文件的内容,而不需要修改源代码。

    3 如果在一个项目中共享全局变量,在使用的文件中,使用extern关键字,声明变量,才可以使用,并且可以得到全局变量的值。

    4 全局变量前加上static修饰,只能在本文件中使用。

    static也可以修饰函数,加了static的变量,就是私有变量,加了static的函数,就是私有函数。

    回到顶部

    三、结构体

    1 在C 中可以使用结构体定义用户自定义的类型,但结构成员类型可以不一样,

    2 格式:

    struct 结构体名{

           成员;

    }变量名;

    struct student{

           int age;

           char name[20];

    }student1,student2;

    3 如果结构体的成员是字符串,是不能通过=号进行赋值,要使用strcpy(student1.name,"zhangsan")

    4结构体的定义不占用内存空间,可以把结构体放到头文件中,项目中的其他文件就可以使用该类型。

    5 如果是基本数据类型,使用结构类型的变量.成员,可以操作该成员。

    6 声明结构体类型的变量,占用空间是所有成员变量所占空间之和。

    7 如果使用结构体变量赋值,相当于将结构体中每一个成员的值,都赋值给新的结构体变量的成员。

    练习:定义一个学生结构体,学号、姓名、年龄、性别(F、M),创建三个学生,输入信息,并输出。(数组)

     1 #include <stdio.h>
     2 #include <string.h>
     3 /*
     4 //如果结构体声明到外面,就变成全局变量
     5 //2.定义结构体类型
     6 struct student{
     7     int age;//成员
     8     char name[20];
     9 };
    10 struct student student1 = {18,"zhangsan"},student2 = {19,"lisi"};//struct student是结构体类型,student1是结构体变量
    11 */
    12 
    13 //typedef起别名
    14 //3.定义结构体类型(在以后的编程中通常使用这种)
    15 typedef struct{
    16     int age;//成员
    17     char name[20];
    18 }student;
    19 
    20 /*
    21  练习:定义一个学生结构体,学号、姓名、年龄、性别(F、M),创建三个学生,输入信息,并输出。
    22  */
    23 //定义学生结构体
    24 typedef struct{
    25     int xuehao;
    26     char name[20];
    27     int age;
    28     char sex;
    29 }student;
    30 
    31 int main(int argc, const char * argv[])
    32 {
    33     /*
    34     //1.定义结构体类型
    35     struct{
    36         int age;//成员
    37         char name[20];
    38     }student1 = {18,"zhangsan"},student2 = {19,"lisi"};//student1声明结构体变量
    39      */
    40     student student1 = {14,"san"};//student是结构体类型,student1是结构体变量名
    41     student student2 = student1;//如果使用结构体变量赋值,相当于将结构体中每一个成员的值,都赋值给新的结构体变量的成员。
    42     student1.age = 22;
    43     strcpy(student1.name,"zhangsan");//给name赋值
    44     printf("student1 name:%s,age:%d
    ",student1.name,student1.age);
    45     printf("student2 name:%s,age:%d
    ",student2.name,student2.age);
    46     
    47     //作业
    48     student students[3];
    49     for (int i = 0; i < 3; i++) {
    50         printf("输入学生信息:
    ");
    51         printf("姓名:
    ");
    52         fgets(students[i].name, 20, stdin);
    53         printf("年龄:
    ");
    54         scanf("%d",&students[i].age);
    55         for (int i = 0; i < 3; i++) {
    56             printf("输入学生信息:
    ");
    57             printf("姓名:%s
    ",students[i].name);
    58             printf("年龄:%d
    ",students[i].age);
    59         }
    60     }
    61     return 0;
    62 }

    回到顶部

    四、联合

    1 联合的用法、语法和结构非常相似,但联合中所有成员分配的内存是同一块。(只保存一个成员的信息,联合的空间以最大成员所占的空间为值)

    2 联合可以用一块内存对应多种数据类型

    3 联合与结构体的区别:

    结构可以保存多个成员信息,而联合只能保存一个成员信息且是最后一个。

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 //定义联合类型
     5 typedef union{
     6     int age;
     7     char name[2];
     8 }LianHe;
     9 int main(int argc, const char * argv[])
    10 {
    11     LianHe lh;
    12     lh.age = 18;
    13     printf("lh age:%d
    ",lh.age);
    14     strcpy(lh.name, "zh");
    15     printf("lh name:%s
    ",lh.name);
    16     printf("lh age:%d
    ",lh.age);
    17     printf("lh name:%s
    ",lh.name);
    18     lh.age = 22;
    19     printf("lh age:%d
    ",lh.age);
    20     printf("lh name:%s
    ",lh.name);
    21     return 0;
    22 }

    回到顶部

    五、枚举

    1 用字母来描述一组有规律的数值。

    2 定义一个枚举

    enum{SBR,SUM,AUT,WIN};

    3 枚举默认值从0开始,每个值都是整型常量

    4 只能在声明枚举时修改枚举值

    5 修改枚举值之后的那个枚举值 = 修改的那个枚举值加1

    练习:输入一个数字,得到相应的季节

     1 #include <stdio.h>
     2 enum{SBR,SUM=5,AUT,WIN};
     3 int main(int argc, const char * argv[])
     4 {
     5     printf("%d
    ",SBR);
     6     printf("%d
    ",SUM);
     7     printf("%d
    ",AUT);
     8     printf("%d
    ",WIN);
     9     return 0;
    10 }
  • 相关阅读:
    [转]PostgreSQL数据类型
    Linux下执行自定义的可执行命令无效原因
    [其它]iOS 12.2支持电信VoLTE了,中国电信教你如何开通:只要三步
    本机无法访问虚拟机里面的nginx的80端口
    百度的网络接入架构图
    如何让局域网中的其他主机访问虚拟机
    java中synchronized 用在实例方法和对象方法上面的区别
    Redis登陆服务器和批量删除指定的key
    vim查找关键字的好方法
    网络攻防之动态修改表单的值
  • 原文地址:https://www.cnblogs.com/yangmx/p/3474604.html
Copyright © 2011-2022 走看看