自学内容网 自学内容网

day19 C语言收尾及数据结构

typedef(类型重命名)

程序员有时候在写某个类型时,对应的那个类型比较长,也比较难记,此时就可以给该类型起个别名  例如:无符号短整形 unsigned short int--->uint16

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //使用类型定义变量: 类型名  变量名;
    int  int_data;         //定义了一个整形变量
    int int_arr[5];            //定义了一个整形数组
    int *int_ptr;             //定义了一个整形指针变量
    int **int_ptr_ptr;        //定义二级指针变量
    int *int_ptr_arr[5];      //定义了一个指针数组
    int (*int_arr_ptr)[5];     //定义了一个数组指针
    int (*fun_ptr)();           //定义了一个函数指针
    int (*fun_ptr_arr[5])();     //定义了一个函数指针数组
    struct Test
    {
        int num;
        double score;
    }Stu;                      //定义了一个结构体变量
    

    //提取上面的类型
    int  ;         //整形
    int [5];            //一个整形数组类型
    int *;             //一个整形指针类型
    int **;             //二级指针类型
    int *[5];      //一个指针数组类型
    int (*)[5];     //一个数组指针类型
    int (*)();           //一个函数指针类型
    int (*[5])();     //一个函数指针数组类型
    struct Test
    {
        int num;
        double score;
    };                        //结构体类型

    //将上面的类型进行重命名
    typedef int  int_data;         //定义了一个整形类型
    typedef int int_arr[5];            //定义了一个整形数组类型
    typedef int *int_ptr;             //定义了一个整形指针类型
    typedef int **int_ptr_ptr;        //定义二级指针类型
    typedef int *int_ptr_arr[5];      //定义了一个指针数组类型
    typedef int (*int_arr_ptr)[5];     //定义了一个数组指针类型
    typedef int (*fun_ptr)();           //定义了一个函数指针类型
    typedef int (*fun_ptr_arr[5])();     //定义了一个函数指针数组类型
    typedef struct Test
    {
        int num;
        double score;
    }Stu;                      //定义了一个结构体类型
    return 0;
}
#include<myhead.h>

//将无符号短整形重新起个别名
typedef unsigned short int  uint16; 

//将数组类型进行重命名
typedef int int_arr[5];

//给函数指针类型重命名
typedef int (*fun_ptr)();

//定义一个函数
int demo()
{
    printf("hello a\n");
    return 0;
}


int main(int argc, const char *argv[])
{
    uint16  num = 520;   //unsigned short int num = 520;

    printf("num=%hu, sizeof(num)=%zd\n", num, sizeof(num));

    int_arr arr;       //此时arr就是长度为5的整形数组,arr就是数组名
    printf("sizeof(arr) = %zd\n", sizeof(arr));  //20
    printf("数组元素分别是:");
    for(int i=0; i<5; i++)
    {
        printf("%d\t", arr[i]);
    }
    printf("\n");

    //使用函数指针类型定义变量
    fun_ptr ptr = demo;       
    printf("sizeof(ptr) = %zd\n", sizeof(ptr));   //8
    ptr();          //使用函数指针变量调用函数



    
    return 0;
}
#include<myhead.h>

typedef int *ptr, num;           //ptr是int*的重命名  num是int的重命名

typedef struct TT 
{
    int num;
    char name[20];
}Stu, *Stu_ptr;


int main(int argc, const char *argv[])
{
    printf("sizeof(ptr) = %zd, sizeof(num) = %zd\n", sizeof(ptr), sizeof(num));
    
    Stu s = {1001, "张三"};        //使用结构体类型定义变量
    //struct TT s = {1001, "张三"};

    Stu_ptr ptr = &s;           //使用结构体指针类型定义变量
    //struct TT *ptr = &s;
    //Stu *ptr = &s;

    printf("s.num = %d, ptr->name = %s\n", s.num, ptr->name);


    return 0;
}

typedef和#define的区别

1。typedef是类型重命名语句,必须以分号结尾,而#define是预处理指令,必须以#开头

2.使用这两个重命名一个类型时,几乎没有区别,主要区别在于命名两个类型时。

#include<myhead.h>

#define INT int            //宏定义
typedef int int32;         //类型重命名

typedef char *PP;       //给double* 重命名
#define FF char *       //宏定义

int main(int argc, const char *argv[])
{
    INT num = 520;        //?
    printf("num = %d, sizeof(num) = %zd\n", num, sizeof(num));
    
    int32 key = 1314;    //?
    printf("key = %d, sizeof(key) = %zd\n", key, sizeof(key));
    
    //使用宏定义变量
    FF a, b;       //char *a,b;  a是指针类型 b是普通类型
    //使用类型重命名定义变量
    PP m,n;             //m和n都是指针类型
    printf("sizeof(a)=%zd,sizeof(b)=%zd,sizeof(m)=%zd,sizeof(n)=%zd\n", \
            sizeof(a), sizeof(b), sizeof(m), sizeof(n));


    return 0;
}

union(共用体)

1.共用体是由相同数据类型或不同数据类型构成的变量的集合,多个成员分享一块内存空间。属于构造数据类型

2.定义格式

union  共用体名
{
    成员类型1   成员变量1;
    成员类型2    成员变量2;
    。。。
    成员类型n    成员变量n;
};

3.使用方式与结构体一致

4.共用体的多个成员,只占用所占内存最多的那个成员的空间,同时也是共用体变量的大小

5.共用体的每个成员的起始地址都跟共用体变量的起始地址一致

6.共用体一般不能当作函数的形参

7.共用体变量也可以初始化,初始化值用花括号括起来,但是,只能初始化一个值

使用共用体判断当前主机大小端问题

union data
{
    int num ;    //整形成员
    char key;   //字符成员
};



int main(int argc, const char *argv[])
{
    //使用共用体定义变量
    union data temp;

    //给整形成员进行赋值
    temp.num = 0x12345678;

    //使用其字符数据
    //temp.key //?
    if(temp.key==0x12)
    {
        printf("大端存储\n");
    }else if(temp.key==0x78)
    {
        printf("小端存储\n");
    }

    
    return 0;
}

enum(枚举)

1.枚举是解决C语言中的“魔鬼数字”(看不懂的数字)

#ff1200--->rgb(红色)

2.C语言可以给某些类数字进行命名的 例如颜色

3.枚举中的每个值,都是一个数字,整形数字

4.枚举的定义格式

      enum 枚举名
{
    名称1  数字1,
    名称2  数字2,
    。。。
    名称n  数字n;
}         //此处不需要加分号
举个例子:
enum Color
{
    red = 10,//如果不赋值默认从0开始
    orange 11,
    yellow 12,
    green 13,
    cyan 14,
    blue 15,
    puple 16
  };

C语言中的关键字总结

数据结构

1.数据结构主要研究的是程序在运行过程中,数据的临时容器的问题

        该容器仅仅只在程序运行时,短暂的保存数据,以便于程序能够快速处理数据

        保存数据-->提供内存空间(数据容器)

        处理数据-->对容器提供算法(增删改查)

2.数据结构是一种思想,并不局限于某个编程语言

3.数据结构分为两部分:数据、结构

4.主要注重逻辑思维,画图分析

数据的概念

         数值数据:如整数、小数、字符数据

        非数值数据:图片、视频、音频

数据元素:能够完整描述某一事物的数据的基本单位

        例如:一个学生的完整信息:姓名、学号、性别、分数

数据项:用于组成数据元素的不可分割的最小单位

        例如:一个学生信息的某一项

数据对象:由多个数据元素构成,用于研究的一个整体。

        例如:一个班级的整体学生信息,就是一个数据对象

多个数据项组成数据元素->多个数据元素组成数据对象->多个数据对象组成数据

数据结构中,是以数据元素为单位进行研究数据的

结构的概念

1.数据元素与数据元素的关系(关联情况)

2.根据关联情况,将结构分为两类:存储结构、逻辑结构

逻辑结构

1.逻辑结构:就是数据元素和数据元素之间的关联情况,根据不同的关联情况,分为四种逻辑结构:

        集合结构、线性结构、树形结构、图形结构

2.集合结构:数据元素之间没有任何关联情况,仅仅只是在同一个集合中。

         例如一个篮子里的多个水果

3.线性结构:数据元素与数据元素之间存在一对一的关系

        例如:排队做核酸,一个弹夹中的所有子弹

4.树形结构:数据元素和数据元素之间存在一对多的关系‘

        例如:族谱、公司组织构架

5.图形结构:数据元素之间存在多对多的关系

        例如:朋友关系

存储结构

1.所谓存储结构,就是逻辑结构在计算机物理内存上的存储方式(映射)也分为四种结构

        顺序存储、链式存储、索引存储、散列存储(哈希存储)

2.顺序存储:使用一段连续的物理内存存储数据元素。特点:逻辑上相邻,物理内存上也相邻

3.链式存储:已用一段不一定连续的存储空间存储数据元素。逻辑上相邻,物理上不一定相邻

4.索引存储:在存储数据元素后,附加一张索引表,标识每个数据元素所在的物理内存位置(书的目录)

5.散列存储:存储数据的物理地址跟数据元素的关键字相关 

线性表

1.所谓线性表就是用多个相同特征元素组成的线性结构        

        相同特征:表示每个数据元素类型一致

        线性结构:数据元素之间存在一对一的关系

2.线性表的特点:在线性表中,除了第一个元素没有前驱最后一个元素没有后继外,其余每个元素有且仅有一个前驱一个后继

        前驱:当前元素前面那个元素称为该元素的前驱

        后继:当前元素后面那个元素称为该元素的后继

分类

按照存储方式:

        顺序表:顺序存储的线性表,使用一段连续的存储空间来存储该线性表

        链表:链式存储的线性表,使用不一定连续的内存空间来存储该线性表

按受限方式:

        栈:其插入和删除操作只允许在同一端进行的线性表

        队列:要求其插入和删除操作在不同端进行的线性表

顺序表

顺序存储的线性表

如何解决顺序存储?

        1.可以使用数组

        2.可以在堆区申请一段空间

如何解决顺序表的元素个数

        引入一个变量,记录顺序表的长度


原文地址:https://blog.csdn.net/luochen330x/article/details/144075982

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!