C语言【自定义数据类型、typedef、动态内存分配】

这篇具有很好参考价值的文章主要介绍了C语言【自定义数据类型、typedef、动态内存分配】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C语言【自定义数据类型、typedef、动态内存分配】

一、自定义数据类型。

关于下面讲到的所有自定义数据类型(enum、struct、union),有一点要说的是:定义类型不是声明变量,做这步操作时不分配内存,也不能在定义类型时赋值(枚举那个不是赋值,是做一个限定,赋值时赋限定之外的值也不报错。)。

1、typedef (给类型起别名的关键字)
// C语言中给数据类型起别名的同时不能声明变量。
// 一个错误的示范:// typedef int Integer i;	// 不能在这里声明i。自定义数据类型同理。
// 给指针类型起别名
typedef int* intptr;
typedef char* String;
// 给数组类型起别名
typedef int fiveInts[5];		// 有一丢丢不一样
// 使用数组类型的别名声明变量并初始化
fiveInts a = {1, 2, 3, 4, 5};	// 记一点,这种大括号形式的初始化只能声明变量时这样使用,否则报错。前面有记错的地方记得改正。
// 给数组指针类型起别名
typedef int (* IntArrayPointer)[5];
// 数组指针类型的使用
int a[5] = {1, 2, 3, 4, 5};
IntArrayPointer p = &a;
2、枚举

​ 可以看作是一个限定取离散值范围的类型。

​ 枚举类型的定义。这个类型一般定义为全大写,因为里面的元素全都是常量。

// 定义枚举类型。
enum WEEKDAY{
    MON,		// 默认为0
    TUE,		// 上面是0,这个默认就是1;如果上面定义了2,这个就是3
    WED,		
    THU = 5,	// 告知 THU为5
    FRI,
    SAT = 1,	// 可与上面的重复,但不建议。  不可为浮点数。
    SUN
};

// 使用上面定义的枚举类型。声明并赋值。
void main(){
    // enum WEEKDAY 是类型; wd是变量名; 值可以是枚举类型之外的数,比如100,但不建议。
    enum WEEKDAY wd = TUE;	
}
// 隐式定义枚举并声明出变量。
enum {
   // 不管是不是隐式定义,这个大括号中不能没有内容,否则报错。
   A,
   B
} day;

​ 枚举没有特殊的遍历方法,也就是说枚举的元素如果值是错乱的,一般就无法完成遍历了。

// 枚举变量的内存大小
// 用上面定义的枚举实验。一个枚举变量就是一个元素的值,整型为4。
// 定义枚举时不分配空间。声明变量时,那个变量存的就是枚举中的一个元素。想一想java中的枚举类。
sizeof(enum WEEKDAY);	// 4
// 枚举与switch...case的搭配。
switch(wd){		// 借用上面声明的wd变量
    case MON:
        // ...
        break;
    case TUE:
        // ...
        break;
    // ...
    default:
        // ...
        break;
}
3、结构体
// 结构体类型的定义
struct Student{	
  	int id;
  	int age;
    // char arr[]; 	// 会报错
  	char *name;		// 直接赋字符串字面值可以,字面值也算是有过空间分配。如果拿它接收个用户输入就会报错。直接指向有空间的值当然也没问题。
};

// 使用
void main(){
    struct Student stu1;
    stu1.id = 1001;
    // stu1[0] = 1002;	// 没有这种写法的。
}
// 结构体指针-----指向结构体类型变量的指针
struct Struct *ptr = &stu1;		// 这个结构体类型上面定义了。stu1上面声明了。
// 结构体指针的使用
(*ptr).id = 1003;
ptr->id = 1004;

​ 结构体中关于空间有一个对齐的问题。两点要求:1、结构体中某一成员的起始地址为该成员所占字节的整数倍;2、结构体整个空间大小要求为其中最大成员的整数倍。

4、共用体

​ 共用体内的成员共同使用同一段空间。

​ 共用体所占内存空间为其内部成员中最大的那个空间。

​ 应用场景:根据条件在字段内定义不同类型的值。

// 共用体类型定义
union Score{
    int score1;
    double score 2;
}

// 使用
union Score a;	// 声明变量
union Score b = {.score2 = 1};	// 声明变量并赋值。
a.score1 = 10;	// 赋值
5、手动动态分配内存

内存的自动动态分配是系统在栈空间完成的。

​ *void ** :C99允许定义一个类型为void的指针变量。这个(void*)类型的指针变量可以指向一块地址,但是这个指针变量除了输出首地址外,其余操作均无意义,这个指针变量的++操作移动一个地址,即1Byte。 这个指针变量可以强转为任何指针类型(如强转为int,就可以一次移动4Byte), 也可以被任何指针强转成这个指针类型。 下面的几个手动动态分配内存的函数返回值都为void * , 可以强转为自己需要的指针类型,即使你需要char * 也建议转过去,而不是用void *。

​ 以下是一些在空间手动分配内存的几个函数及其使用。需要引入头文件 <stdlib.h>

// malloc函数
// 内存分配成功返回一个void*,指针指向新分配内存的起始地址;分配失败返回NULL
void * malloc(size_t size);		

// malloc函数的使用
int *p = NULL;
if(p==NULL){
    p = (int *) malloc(sizeof(int));	// 分配一个int类型的空间
} 
*p = 100;	// 给分配的这个int赋值
free(p);	// 释放这个内存

我们可以通过指针修改const声明的常量的值。但是const这种常量根本就不能作为数组的长度。

如果想使用变量指定数组长度,除了动态分配我想不出别的方法。

// maloc实现数组的动态分配
int n = 5;
int *p = (int *) malloc(n*sizeof(int));
p[0] = 10;	// 因为转成的(int*)类型,所以p[0]即前四个Byte所表示的数组,可赋值或修改。
// calloc函数 (自带初始化为0的功能)
// 第一个参数为要分配的元素个数,第二个参数为要分配给每个元素的字节数。
void * calloc(size_t numElements, size_t sizeofElement);	

// calloc函数的使用
int *p = (int *) calloc(5, sizeof(int));	// 给p指针分配了5个int堆内存
free(p);	//释放
// realloc函数
// 第一个参数是要重新分配堆内存的指针,第二个参数是新分配内存的大小。
// 返回一个指向重新分配内存块的指针,一般分配的地址还是原地址,且一般数据不会改
void * realloc(void *ptr, size_t size);

// realloc函数的使用
int *p = (int *) malloc(5*sizeof(int));
p = realloc(p, 5*sizeof(int));
free(p);

在全局声明的指针,不能再全局分配内存。

给指针动态分配好内存后,它的初始值是随机的。

calloc函数有初始化0的功能。文章来源地址https://www.toymoban.com/news/detail-747021.html

到了这里,关于C语言【自定义数据类型、typedef、动态内存分配】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言系列9——动态内存分配与释放

    在计算机编程中,动态内存分配与释放是一项重要的操作。本文将介绍malloc与free这两个基本操作,探讨内存泄漏的原因及避免策略,并通过实际案例讨论动态数组的创建与管理技巧。 动态内存分配是现代编程中的一个关键概念。与静态内存分配不同,动态内存分配允许程序

    2024年02月19日
    浏览(50)
  • 操作系统动态内存分配算法【C语言实现】

    题目: 采用五个算法,各自作业在1024kB空间上分配情况。 内存可变分区分配仿真算法 :首次适应,下次适应,最佳适应,最坏适应和快速分配。 使用的结构体数组表示起始地址,内存块大小,内存块状态(0空闲,1占用) void bubbleprint(struct Info info[]) 函数是为了内存块大小

    2024年02月03日
    浏览(44)
  • c语言:通讯录管理系统(动态分配内存版)

    前言: 本通讯录管理系统一共三个版本,除此文章以外还有如下俩个版本,大家可以根据需求自取: 基础增删查改功能版本 :c语言:通讯录管理系统(增删查改)_luming.02的博客-CSDN博客 文件保存版本 :c语言:通讯录管理系统(文件版本)-CSDN博客         本文是在基

    2024年02月08日
    浏览(60)
  • 8.8 【C语言】动态内存分配与指向它的指针变量

    栈:全局变量和局部变量,全局变量是分配在内存中的静态存储区的,非静态的局部变量是分配在内存中的动态存储区的。 堆:数据临时存放在一个特别的自由存储区。 对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这四个函数。 1.用mallo

    2024年02月11日
    浏览(45)
  • 数据结构:动态内存分配+内存分区+宏+结构体

    1.定义一个学生结构体,包含结构体成员:身高,姓名,成绩;定义一个结构体数组有7个成员,要求终端输入结构体成员的值,根据学生成绩,进行冒泡排序。 1.申请一个10个int类型的堆区空间,并实现选择排序(需要导入头文件 #include stdlib.h) 2.用##拼接带参宏的参数 3.宏函

    2024年02月20日
    浏览(44)
  • 【C语言高阶篇】成为编程高手必学内容,动态内存分配我不允许还有人不会!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,又是新的一天开始了,今天给大家带来的是动态内存规划这一章节!    ⛳️ 我们在创建变量的时候大家都知道大小是固

    2024年02月16日
    浏览(49)
  • 【C语言高阶篇】成为编程高手必学内容,程序中的动态内存分配我不允许还有人不会!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,又是新的一天开始了,今天给大家带来的是动态内存规划这一章节!    ⛳️ 我们在创建变量的时候大家都知道大小是固

    2024年02月16日
    浏览(48)
  • 【C语言】自定义类型:结构体【结构体内存具详细】,枚举,联合

      目录 一、结构体 1.结构的声明  2.特殊的声明 3.结构的自引用 4.结构体变量的定义和初始化   5.结构体内存对齐(重点来了) 6.为什么会存在内存对齐  7.修改默认对齐数 8.结构体传参 二、位段 1.什么是位段 2.位段的内存分配 3.位段的跨平台问题 三、枚举 1.枚举类型的定

    2024年02月07日
    浏览(50)
  • 【C/C++】静态内存分配与动态内存分配

    1.1 - 定义概述 内存分配 (Memory Allocation) 是指为计算机程序或服务分配物理内存空间或虚拟内存空间的一个过程。通常在程序执行前或执行时完成内存分配。 1.2 - 分类概述 存在两种类型的内存分配: 编译时内存分配或静态内存分配 (Compile-time or Static Memory Allocation) 运行时内存

    2024年02月11日
    浏览(41)
  • C语言自定义类型:结构体的使用及其内存对齐【超详细建议点赞收藏】

    结构是一些值的集合,这些值称为 成员变量 。 结构的每个成员可以是不同类型的变量 。 注意 : 成员列表可以是不同类型的变量; 成员后一定要有分号; 花括号后也有一个分号。 例如描述一个学生: 注意:上述代码没有创建变量,也没有初始化, 只是声明了一个结构体类

    2024年03月13日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包