结构体,共用体,typedef与define的区别,链表

    xiaoxiao2026-09-14  1

    首先自己发现的一点不懂的

    定义:字符的赋值  char a='A';

                      char a[10]="A";   结构体:

    1:结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型构造数据类型不占用内存空间。

    结构体变量才包含了实实在在的数据,需要内存空间来存储。

    2:结构体里面不能对数据进行赋值(重点);

    3:有名结构体 struct card{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩 } card1, card2;

    注意大括号后面的分号;不能少,这是一条完整的语句。

    结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)

    4:将不同类型的数据组合成一个整体----自定义数据类型

    5:还有一种无名结构体 (固定选择范围),定义几个就只能使用几个(在结构体的末尾定义)

    有结构体的想定义多少就多少;

     取值:1:      struct  card card1;(第一种定义初始化)

     取值 2:结构体末尾定义并初始化 struct{ //没有写 card char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩 } card1, card2; }card1,card2; (第二种定义初始化) 定义后才可以使用 取结构体里面的数据 printf("%s,%d",card1.name,card1.age); 两种赋值方法        sprintf(card.name,"三只熊");   strcpy(card.name,"三只熊");   (需要用#include<string.h>来应用) 打印printf("%s",card.name);

    struct{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 } stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 }; 整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。

    6:内存问题

    理论上讲结构体的各个成员在内存中是连续存储的,和数组非常类似,例如上面的结构体变量 card1、card2 的内存,共占用 4+4+4+1+4 = 17 个字节。 //指针数组是四个字节的

    但是在编译器的具体实现中,各个成员之间可能会存在缝隙,对于 stu1、stu2,成员变量 group 和 score 之间就存在 3 个字节的空白填充。这样算来,stu1、stu2 其实占用了 17 + 3 = 20 个字节。

    共用体:构造数据类型,,也叫联合体

    用法和结构体的用法一样;

    不同之处:在main函数里面,只能使用共用体一个变量,只会输出一个变量,就是最后赋值的那个 struct my{ char a[9]; double b; //a[9]有九个字节,double有8个字节, }me; //如果两者字节可整除,那最大字节为9,如果不能,那就是距离9最近的2的次方也就是2的四次方为16 void main(){ printf("%d",sizeof(me)); //得到的结果为16, } 枚举类型 (取值范围)

    C语言typedef:给类型起一个别名

    typedef定义步骤

    使用关键字 typedef 可以为类型起一个新的别名,语法格式为:

    typedef  oldName  newName;

    1:typedef没有创造新数据类型

    2:typedef是定义类型,不能定义变量

    typedef 还可以给①数组、③指针、②结构体等类型定义别名。

    typedef char ARRAY20[20];

    表示 ARRAY20 是类型 char [20] 的别名。它是一个长度为 20 的数组类型。接着可以用 ARRAY20 定义数组:

    ARRAY20 a1, a2, s1, s2;

    它等价于:

    char a1[20], a2[20], s1[20], s2[20];

    ,为结构体类型定义别名:

    typedef struct stu{ char name[20]; int age; char sex;} STU; STU 是 struct stu 的别名,可以用 STU 定义结构体变量:

    STU body1,body2;

    它等价于:

    struct stu body1, body2;

    与#define的区别

    1) 可以使用其他类型说明符对宏类型名进行扩展,但对 typedef 所定义的类型名却不能这样做

    #define INTERGE int unsigned INTERGE n;  //没问题 typedef int INTERGE; unsigned INTERGE n;  //错误,不能在 INTERGE 前面添加 unsigned

    2) 在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证

    #define PTR_INT int * PTR_INT p1, p2;

    经过宏替换以后,第二行变为:

    int *p1, p2;

    这使得 p1、p2 成为不同的类型:p1 是指向 int 类型的指针,p2 是 int 类型。 链表:静态线性表 //简单静态链表 #include<stdio.h> #include<stdlib.h> struct num{ int sum; struct num *p; //定义一个指针 }; void main(){ struct num n1,n2,n3,n4,n5,n6,n7; //定义 struct num *head=NULL; //头指针 同一个类型的两个不同指针 头指针指向第一个元素得到地址, n1.sum=1; //然后结构体的指针指向第二个元素地址,然后结构体的指针指向第三个元素地址, n2.sum=2; //最后那个元素的地址指向空(NULL) n3.sum=3; n4.sum=4; n5.sum=5; n6.sum=6; n7.sum=7; head=&n1; n1.p=&n2; n2.p=&n3; n3.p=&n4; n4.p=&n5; n5.p=&n6; n6.p=NULL; //删除元素 n3.p=&n5; n4.p=NULL; //插入元素 n3.p=&n7; n7.p=&n4; //增加元素 n6.p=&n7; n7.p=NULL; while(head!=NULL){ printf("%d\n",head->sum);//利用循环打印,比单独打印更方便 head=head->p; } system("pause"); }

    转载请注明原文地址: https://ju.6miu.com/read-1312050.html
    最新回复(0)