首页 > 其他分享 >C语言基础-结构体

C语言基础-结构体

时间:2023-04-07 17:48:11浏览次数:35  
标签:struct name 基础 C语言 char stu Student printf 结构

C语言基础-结构体

结构体的现实意义

现实世界里有很多事物是由不同的部分组合起来的。例如手机由屏幕、CPU、芯片、电池等多个部分组成。同时,对于每个组件如电池又由其他细小组件组成。结构体就是把这些组件组合在一起,进行统一的访问和管理。
结构体可以理解成是对现实世界的抽象。结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”,更加利于程序的阅读和理解及移植。而且结构体的存储方式可以提高CPU对内存的访问速度。

定义结构体

struct 数据类型名{
//结构体数据成员列表
};

实例1

struct student{
    char * name;
    char * gender;
    char * mail;
    int age;

};

在定义完结构体后,要声明结构体变量

  • 方式1
struct Student student;
  • 方式2
struct Student{
    char name[10];
    char * gender;
    char * mail;
    int age;

}stu;  // 在这里增加一个变量`stu`,则`stu`为结构体变量
  • 方式3
struct {
    char *name;
    char * gender;
    char * mail;
    int age;
}stu;   

这种方式之后无法再继续定义变量。

结构体变量的初始化

  • 结构体定义时初始化
struct Student{
    char name[10];
    char * gender;
    char * mail;
    int age;
}student = {"张三", "男", "[email protected]", 21};
  • 变量定义时初始化
struct Student stu;
stu = (struct Student){
    "张三",
    "男",
    "[email protected]",
    21
};
  • 单成员进行赋值
//对数组类型的数据不能直接赋值,例如stu.name = "张三";
strcpy(stu.name, "张三");
stu.age = 21;
stu.gender = "男";

结构体变量的使用

可以使用变量.成员字段来使用结构体的数据成员

strcpy(stu.name, "张三");
stu.age = 21;
stu.gender = "男";
stu.mail = "[email protected]";
printf("%s\n", stu.name);
printf("%d\n", stu.age);
printf("%s\n", stu.gender);
printf("%s\n", stu.mail);

结构体数组

  • 语法定义
struct Student{
    char * name;
}stu[5];

使用上与单个结构体变量相同,在数组中需要加上在数组中的下标

  • 使用案例
# include <stdio.h>
# include <string.h>
struct Student{
    char * name;

};
int main(){
    struct Student stu[2];
    stu[0] = (struct Student){"张三"};
    printf("%s\n", stu[0].name);
    return 0;

}
  • 结构体指针

指向结构体类型的指针

  • 使用案例
# include <stdio.h>
# include <string.h>
struct Student{
    char * name;

};
int main(){
    struct Student stu = {"张三"};
    struct Student *p;
    p = &stu;
    printf("%s\n", (*p).name);
    printf("%s\n", p->name);
    return 0;
}

结构体嵌套

一个结构体当中可以包含其他类型的结构体,结构体自身当中不能包含相同类型的结构体,但是可以包含执行自身的指针

  • 使用案例
# include <stdio.h>
# include <string.h>
struct gender{
    char * ch;
};

struct Student{
    char * name;
    struct Student * s;
    struct gender gen;

};
int main(){
    struct gender gen = {"男"};
    struct Student stu = {"张三"};
    struct Student student = {
        "张三",
        & stu,
        gen
    };
    printf("%s\n",student.name);
    printf("%s\n",(student.s)->name);
    printf("%s\n",student.gen.ch);
    return 0;
}

结构体变量在作为参数传递的时候使用的是值传递

typedef struct 与struct的区别

typedef关键字可以将一种数据类型添加一种别名,例如typedef int Int,此时Int等价于int。在struct中,定义的别名可以直接用于定义变量,等价于struct类型名

  • 使用案例
# include<stdio.h>
# include <string.h>
struct gender {
    char * ch;
};

typedef struct Student{
    char *name;
    struct Student * s;
    struct gender gen;

}Stu;

int main(){
    struct gender gen = {"男"};
    struct Student stu = {"张三", NULL};
    struct Student student = {
        "张三",
        &stu,
        gen

};
// 使用新定义的类型名定义指针变量,等价于struct Student
     Stu *s = &student;
     printf("%s\n",(*s).name);
     printf("%s\n", ((*s).s)->name);
     printf("%s\n",(*s).gen.ch);
    return 0;
}

enum枚举

枚举就是将我们数据可能存在的结果有限个的罗列出来,比如一个人的性别不是男就是女。

  • 使用案例
# include <stdio.h>
# include <string.h>
enum Gender{
    MAN = 1, //不指定值则从0开始
    WOMAN = 2 //不指定值则从上一个定义的值开始递增,为2
};
int main(){
    //定义枚举变量
    enum Gender g;
    // 枚举变量只可能存在一种值
    g = WOMAN;
    printf("%d\n",g);
    return 0;
}

union共用体

共用体内部可以定义N个变量,但是这
N个变量之间会相互影响。共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员

  • 使用案例
# include <stdio.h>
# include <string.h>
union Data{
    int a;
    char b;
    short c;
};
int main(){
    union Data d;
    d.a = 46;
    printf("%d\n",d.a);
    printf("%c\n",d.b);
    printf("%d\n",d.c);
    printf("%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
    d.b = 'a';
    printf("%d\n",d.a);
    printf("%c\n",d.b);
    printf("%d\n",d.c);
    printf("%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
    d.c = 47;
    printf("%d\n",d.a);
    printf("%c\n",d.b);
    printf("%d\n",d.c);
    return 0;

}

结果显示:

46
.
46
%%%%%%%%%%%%%
97
a
97
%%%%%%%%%%%%%
47
/
47

标签:struct,name,基础,C语言,char,stu,Student,printf,结构
From: https://www.cnblogs.com/bonne-chance/p/17296835.html

相关文章

  • 【python基础】五大数据类型及常用方法
    1.数据类型概述 python中的字符串,列表,元组,字典,集合这五种数据类型均是可迭代的,可以使用for循环访问,涵盖了三类数据结构分别为序列、散列、集合。序列: 字符串str 列表list() 元组tuple() 散列: 字典dict() 集......
  • 动力节点王鹤SpringBoot3笔记—— 第二章 掌控SpringBoot基础篇
    第二章掌控SpringBoot基础篇2.1SpringBoot?SpringBoot是目前流行的微服务框架倡导约定优先于配置”其设目的是用来简化新Spring应用的初始化搭建以及开发过程。SpringBoot提供了很多核心的功能,比如自动化配置starter(启动器)简化Maven配置、内嵌Servlet容......
  • java基础——静态代理和动态代理
    java代理模式有静态代理和动态代理两种实现方式一、静态代理代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。优点:可以在不修改目标对象的前提下扩展目标对象的功能......
  • JUC并发编程基础篇第二章之CompletableFuture[加强版的线程]
    @目录1、创建线程的几种方式2、Future的优缺点3、CompletableFuture对Future的改进3.1、CompletableFuture的基本结构3.2、创建CompletableFuture四种方式3.3、CompletableFuture的流式调用3.4、CompletableFuture常见的用法1、创建线程的几种方式newthread://构造......
  • JUC并发编程基础篇第三章之Synchronized八锁案例[理解锁的对象]
    目录1、总结2、Java8锁案例1打印的方法都有synchronized修饰,先调用email,后调用Sms;输出顺序?案例2如果在发送email的方法,加入了暂定3s中的操作,打印顺序?案例3增加一个普通的方法hello,此时b线程调用hello,先打印email还是hello?案例4有两部手机,先打印邮件还是短信案......
  • JUC并发编程基础篇第四章之公平锁/重入锁/死锁[常见锁的基本认识]
    @目录1、公平锁/非公平锁1.1、概念1.2、非公平锁代码案例1.3、公平锁代码案例1.4、面试题:为什么会有这样的公平锁和非公所这样的设计2、重入锁2.1、简介2.2、没有重入锁,会发生什么问题2.3、可重入锁的种类2.3.1、隐式锁2.3.2、显式锁2.4、面试题:可重入锁的实现机制3、死锁3.1......
  • JUC并发编程基础篇第六章之LockSupport[notify,signal之外的另一种唤醒方式]
    目录1、LockSupport有什么用2、使用wait和notify唤醒一个线程2.1、正常情况2.2、异常情况2,这里去掉了synchronized(o){}代码块2.3、异常情况3先notify再wait3、使用await和signal唤醒一个线程3.1、正常情况3.2、异常情况:如果去除锁块3.3、异常情况:先执行signal......
  • JUC并发编程基础篇第五章之线程中断状态[你理解的线程中断,只会Thread.interrupted()
    目录1、什么是线程的中断机制2、isterruptinterruptedisInterrupted区别3、面试题3.1、如何停止中断运行中的线程3.2、当前线程的中断标识符为true,是不是线程就立马停止了3.3、如果线程处于被阻塞的状态(列入sleep,wait,join等状态),在别的线程调用当前线程的interrupt()方法,会发生......
  • GO - 结构体嵌套
    概述Go支持将多个结构体通过嵌套的方式,组成一个大的结构体,降低了单个结构体复杂度,同时提高了结构体之间组合的灵活性。例子为了省略篇幅,本小节只使用 字面量 方式初始化,new() 的初始化方式请参照 结构体 小节。每个结构体单独初始化,最后组装package mainimport (......
  • 006.系统目录结构
    Linux 系统目录结构登录系统后,在当前命令窗口下输入命令:ls/ 你会看到如下图所示: 树状目录结构:   以下是对这些目录的解释:/bin:常用bin是Binaries(二进制文件)的缩写,这个目录存放着最经常使用的命令。/root:常用该目录为系统管理员,也称作超级权限者的用户......