Linux(七)

Linux(七)

  • 结构体---位域/位段 (为了节省空间)
  • 字节对齐:一次性分配多少个字节 (64/32)
    • 基本数据类型对齐方式
    • 结构体对齐方式:按照成员中最大的对齐方式
  • 共用体
    • 如何定义共用体
    • 如何定义一个共用体的变量
    • 大小端
      • 什么是大端序和小端序
      • 如何测试计算机是小端序还是大端序
  • 枚举:定义常量的一种方式,为了让程序更加语义话
    • 定义一个枚举数据类型
    • 定义一个枚举变量
  • 函数指针
    • 定义一个指向函数的指针
    • 定义一个函数指针数组
    • 函数指针作为函数的参数
    • 给函数指针取了别名
  • 指针函数
  • 堆区的使用
    • 申请空间
  • 递归
  • 存储类型
    • auto 自动的
    • register 寄存器 (CPU中的存储器)
    • static 静态的
      • 修饰全局变量 (隐藏)
      • 修饰函数 (隐藏)
      • 修饰局部变量
    • extern 外部的
      • 修饰全局变量,表示引入外部变量
      • extern修饰函数

结构体—位域/位段 (为了节省空间)

#include <stdio.h>
//1.定义一个日期的数据类型
typedef struct date
{
	//用一个变量的某几位来保存某个值 位域 /位段
	unsigned int year:11;//0---2048 //unsigned int (0----2^32-1)
	unsigned int month:4; //0--15
	unsigned int day:5; //0---31
}Date;
//2.定义一个学生的结构体数据类型
typedef struct student
{
	char name[20]; //姓名
	int height; //身高
	Date birDay; //出生日期
}Stu;

int main(void)
{
	//位域 优点:节省空间
	// 缺点:输入的时候不能使用scanf(),因为找不到首地址,只能用赋值
	printf("sizeof(Date)=%ld\n",sizeof(Date));
	printf("sizeof(Stu):%ld\n",sizeof(Stu));
	Stu s1={"zhangsan",178,{1998,8,8}};
	printf("%s %d
	%04d:%02d:%02d\n",s1.name,s1.height,s1.birDay.year,s1.birDay.month,s1.birDay.day
	);
return 0;
}

字节对齐:一次性分配多少个字节 (64/32)

基本数据类型对齐方式

在这里插入图片描述

结构体对齐方式:按照成员中最大的对齐方式

在这里插入图片描述
在这里插入图片描述

#pragma pack(2) 和默认的对齐方式取最小

共用体

在这里插入图片描述

如何定义共用体

union 共用体名
{
	成员列表;
}
union job
{
	char dept[20];
	int class;
};
//定义了一个共用体数据类型,该共用体数据类型的名字叫 union job

如何定义一个共用体的变量

//类型名 变量名;
union job j1;

大小端

在这里插入图片描述

什么是大端序和小端序

在这里插入图片描述

如何测试计算机是小端序还是大端序

在这里插入图片描述

枚举:定义常量的一种方式,为了让程序更加语义话

定义常量的方式
<1>.宏定义 #define N 20
<2>.const const int a=20;
a=30; error (只读变量,不能被修改)
<3>.枚举

定义一个枚举数据类型

enum 名字
{1,2
};
enum color
{
	RED,BLUE,GREEN,WHIRE,BLACK
};
//定义了一个枚举数据类型,该枚举数据类型的名字叫enum color
//enum color中的值默认从0开始,后面的值依次加1 #define RED 0

定义一个枚举变量

//类型名 变量名
enum color e1;
e1=RED;
#include <stdio.h>
//1.定义一个枚举数据类型
enum color
{
	RED,BLUE,GREEN,WHITE=100,BLACK
};
//枚举中的值默认从0开始,后面依次加1
//定义一个枚举数据类型,该数据类型的名字叫enum color
int main(void)
{
	//2.定义一个枚举变量
	//类型名 变量名
	enum color e1;
	e1=BLUE;
	printf("e1=%d\n",e1);
	return 0;
}

函数指针

//定义一个指向int的指针 int * pi
//定义一个指向char的指针 char * pc
//定义一个指向char的指针的指针 char ** ppc
//定义一个指向数组的指针,该数组是一个长度为5的int数组 int [5] int (*pArr)[5]

定义一个指向函数的指针

#include <stdio.h>
int add(int num1,int num2)
{
	return num1+num2;
}
int sub(int num1,int num2)
{
	return num1-num2;
}
int mul(int num1,int num2)
{
	return num1*num2;
}
int div(int num1,int num2)
{
	return num1/num2;
}
int main(void)
{
	//定义一个指向数组的指针,该数组是一个长度为5的int数组
	// int [5]
	int ( *pArr) [5];
	//函数的数据类型 返回值类型 (形参列表)
	// int (int,int)
	//1.定义一个指向函数的指针
	int (*pFun) (int,int)=NULL;
	//pFun=//函数的首地址 &+函数的名字
	//pFun=&add; //add<====>*pFun
	//为了简化操作,函数名代替了函数的首地址
	pFun=add;
	printf("add=%d\n",add(12,3));
	//函数指针去调用
	printf("add=%d\n",(*pFun)(12,3));
	printf("add=%d\n",pFun(12,3));
	return 0;
}

定义一个函数指针数组

#include <stdio.h>
int add(int num1,int num2)
{
	return num1+num2;
}
int sub(int num1,int num2)
{
	return num1-num2;
}
int mul(int num1,int num2)
{
	return num1*num2;
}
int div(int num1,int num2)
{
	return num1/num2;
}
int main(void)
{
	//函数的数据类型 返回值类型 (形参列表)
	// int (int,int)
	//1.定义一个指向函数的指针变量
	int (*pFun) (int,int)=NULL;
	//int a;
	//为了简化操作,函数名代替了函数的首地址
	pFun=add;
	printf("add=%d\n",pFun(12,3));
	//2.定义一个函数指针数组,该数组中有4个元素,每个元素是一个指向函数的指针 int
	arr[4]={12,34,56,78}
	int (*pFunArr[4]) (int,int)={add,sub,mul,div};
	//add <---> pFunArr[0]
	int i=0;
	for(i=0;i<4;i++)
	{
		printf("%d ",pFunArr[i](12,3));
	}
	printf("\n");
	return 0;
}

函数指针作为函数的参数

#include <stdio.h>
int add(int num1,int num2)
{
	return num1+num2;
}
int sub(int num1,int num2)
{
	return num1-num2;
}
int mul(int num1,int num2)
{
	return num1*num2;
}
int div(int num1,int num2)
{
	return num1/num2;
}
//编写一子函数,实现两个整数的相关运算
//参数1: 函数的指针 int (*)(int,int ) 函数的类型int (int ,int)
//参数2: int num1
//参数3: int num2
//返回值:运算的结果
int cal(int (*pfun)(int,int),int num1,int num2)
{
	return pfun(num1,num2);
}
int main(void)
{
	printf("%d ",cal(add,12,3)); //+
	printf("%d ",cal(sub,12,3)); //-
	printf("%d ",cal(mul,12,3)); //*
	printf("%d \n",cal(div,12,3)); //(/)
	return 0;
}

给函数指针取了别名

typedef struct student Stu; //struct student ------>Stu
#include <stdio.h>
int add(int num1,int num2)
{
	return num1+num2;
}
int sub(int num1,int num2)
{
	return num1-num2;
}
int mul(int num1,int num2)
{
	return num1*num2;
}
int div(int num1,int num2)
{
	return num1/num2;
}
//1.给函数指针取了别名
typedef int (*pFun)(int,int); //int (*) (int,int) --->pFun 类型名
//4.函数指针作为参数传参
//参数1:函数的指针
//参数2: int num1
//参数3: int num2
//返回值:int
int cal(pFun pf,int num1,int num2)
{
	return pf(num1,num2);
}
int main(void)
{
	//2.定义一个函数指针变量
	pFun pf=add;
	printf("%d\n",pf(12,3));
	//3.定义一个函数指针数组
	pFun pfunArr[4]={add,sub,mul,div};
	int i=0;
	for(i=0;i<4;i++)
	{
		printf("%d ",pfunArr[i](12,3));
	}
	printf("\n");
	printf("%d ",cal(add,12,3));
	printf("%d ",cal(sub,12,3));
	printf("%d ",cal(mul,12,3));
	printf("%d \n",cal(div,12,3));
	return 0;
}

指针函数

定义:返回值是指针的函数

<存储类型>  数据类型  函数名(参数列表)
    		int*    add()
int* add(int a, int b)
{
    int *p = NULL;
    return p;
}

调用:

int* res = add(a, b);

在这里插入图片描述

使用NULL时,必须引用stdio.h头文件

堆区的使用

定义在自定义函数中的变量会随着程序的结束而释放,如果我们想得到变量的值,必须使用静态的变量。

但是这样会导致内存无法及时释放,资源占用大。所以引出堆区空间的使用。

堆区:程序员自己申请自己释放的一片的空间。

申请空间

<1> 函数原型

#include <stdlib.h>
void* malloc(size_t size);

<2> 函数参数

size_t size
size_t————>unsigned int
ssize_t————>signed int
size————>申请空间大小(字节)

<3>函数返回值

void* 类型的指针————>万能指针
成功返回:申请到(开辟)空间的首地址
失败返回:NULL

<4>函数调用

int* malloc_func()
{
    int* ptr = (int*)malloc(sizeof(int));
	if(ptr == NULL)
	{
 		printf("申请失败\n");   
	}
	return ptr;
}
int main()
{
    int* pr = malloc_func();
}

递归

在这里插入图片描述
在这里插入图片描述

存储类型

static extern auto register

auto 自动的

//类型名 变量名
// 存储类型 类型名 变量名
auto

register 寄存器 (CPU中的存储器)

register int i=10;

static 静态的

修饰全局变量 (隐藏)

在这里插入图片描述

修饰函数 (隐藏)

在这里插入图片描述

修饰局部变量

在这里插入图片描述
在这里插入图片描述

extern 外部的

修饰全局变量,表示引入外部变量

在这里插入图片描述

extern修饰函数

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/646076.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

京东Java社招面试题真题,最新面试题

Java中接口与抽象类的区别是什么&#xff1f; 1、定义方式&#xff1a; 接口是完全抽象的&#xff0c;只能定义抽象方法和常量&#xff0c;不能有实现&#xff1b;而抽象类可以有抽象方法和具体实现的方法&#xff0c;也可以定义成员变量。 2、实现与继承&#xff1a; 一个类…

地下城游戏(leetcode)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 地下城游戏https://leetcode.cn/problems/dungeon-game/description/ 图解分析&#xff1a; 代码 class Solution { public:int calculateMinimumHP(vector<vector<int>>& vv) {int row vv.size(), col …

2024 年 5 个 GO REST API 框架

什么是API&#xff1f; API是一个软件解决方案&#xff0c;作为中介&#xff0c;使两个应用程序能够相互交互。以下一些特征让API变得更加有用和有价值&#xff1a; 遵守REST和HTTP等易于访问、广泛理解和开发人员友好的标准。API不仅仅是几行代码&#xff1b;这些是为移动开…

内存函数memcpy和memmove的详解及模拟实现

1.函数memcpy void * memcpy ( void * destination, const void * source, size_t num );函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 这个函数在遇到 ‘\0’ 的时候并不会停下来。 如果source和destination有任何的重叠&#xff0c;复制的…

网络攻防概述(基础概念)

文章目录 APTAPT概念APT攻击过程 网络空间与网络空间安全网络空间(Cyberspace)网络空间安全(Cyberspace Security) 网络安全属性机密性(Confidentiality或Security)完整性(Integrity)可用性&#xff08;Availability&#xff09;不可否认性&#xff08;Non-repudiation&#xf…

如何从头搭建一个自己的java库并上传到maven官方仓库

创建代码 在代码库根目录执行maven命令&#xff0c;用于快速生成一个基础的Maven项目 mvn archetype:generate \-DgroupIdcom.mycompany \-DartifactIdmy-maven-project \-Dversion1.0.0 \-DarchetypeArtifactIdmaven-archetype-quickstart \-DinteractiveModefalse 这个命令…

OS复习笔记ch6-2

死锁的解决 死锁的预防&#xff08;打疫苗&#xff09;死锁的避免&#xff08;戴口罩&#xff09;死锁的检测&#xff08;做核酸&#xff09; 死锁的预防 前面我们提到了死锁的四个必要条件 防止前三个必要条件&#xff0c;就是间接预防防止最后一个必要条件–循环等待&…

【NumPy】关于numpy.median()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

9.Redis之list类型

list相当于链表、数据表 1.list类型基本介绍 列表中的元素是有序的"有序"的含义,要根据上下文区分~~有的时候,谈到有序,指的是"升序","降序”有的时候,谈到的有序,指的是, 顺序很关键~~如果把元素位置颠倒,顺序调换.此时得到的新的 List 和之前的 Li…

Linux(六)

Linux&#xff08;六&#xff09; 自定义头文件自定义头文件中写什么如何引入头文件条件编译条件编译作用 gcc工作原理Make 工作管理器什么是Make什么是Makefile/makefileMakefile假目标Makefile中的变量自定义变量预定义变量自动变量 Makefile中变量展开方式递归展开方式简单展…

【C++】二分查找算法

1.题目 2.算法思路 暴力解法&#xff1a;可以将数组遍历一遍&#xff0c;就可以找到。时间复杂度为O(n)。不算太差&#xff0c;可以接受。 但是有更优秀的解法&#xff1a; 就是二分查找算法。 算法的特点&#xff1a;我们所查找的“数组”具有二段性。这里的二段性不一定有…

Vue 安装vue

1、官网安装下载安装nodejs 2、安装完成后&#xff0c;通过命令查看版本,可以查看到版本 node -v npm -v 3、安装Vue CLi npm install -g vue/cli 4、创建项目,vue create test 如果遇到报错&#xff1a; ERROR Error: spawn yarn ENOENT Error: spawn yarn ENOENT at ChildP…

人工智能+跨癌种分析,能否解决医学数据样本量小的问题?【医学AI|顶刊速递|05-26】

小罗碎碎念 先说明&#xff0c;目前小罗只是硕士&#xff0c;以下个人观点很有可能不准确&#xff0c;欢迎批评指正&#xff01;&#xff01;小罗虚心听取有益建议&#xff01;&#xff01; 众所周知&#xff0c;医学数据相比于其他领域的数据来说&#xff0c;属于小样本数据。…

【仿RabbitMQ消息队列项目day4】GTest测试框架使用

一.什么是GTest? GTest是一个跨平台的 C单元测试框架&#xff0c;由google公司发布。gtest是为了在不同平台上为编写C单 元测试而生成的。 二.使用 TEST(test_case_name, test_name)&#xff1a;主要用来创建⼀个简单测试&#xff0c; 它定义了一个测试函数&#xff0c; 在这个…

【NumPy】关于numpy.sum()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

安卓自定义控件(视图、改造控件、通知Notification、界面绘制)

视图的构建过程 此节介绍一个视图的构建过程&#xff0c;包括&#xff1a;如何编写视图的构造方法&#xff0c;4个构造方法之间有什么区别&#xff1b;如何测量实体的实际尺寸&#xff0c;包含文本、图像、线性视图的测量方法&#xff1b;如何利用画笔绘制视图的界面&#xff…

Ubuntu22.04设置程序崩溃产生Core文件

Ubuntu22.04设置程序崩溃产生Core文件 文章目录 Ubuntu22.04设置程序崩溃产生Core文件摘要Ubuntu 生成Core文件配置1. 检查 core 文件大小限制2. 设置 core 文件大小限制3. 配置 core 文件命名和存储路径4. 重启系统或重新加载配置5. 测试配置 关键字&#xff1a; Ubuntu、 C…

跨平台之用VisualStudio开发APK嵌入OpenCV(一)

序 本篇是杂谈以及准备工作&#xff08;此处应无掌声&#xff09; 暂时不管iOS&#xff08;因为开发hello world都要年费&#xff09; 软件&#xff1a; Visual Studio 2019&#xff08;含Android SDK和NDK编译器等&#xff09; OpenCV 这是一个女仆级的系列文章&#xf…

代码随想录|Day56|动态规划 part16|● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 class Solution: def minDistance(self, word1: str, word2: str) -> int: dp [[0] * (len(word2) 1) for _ in range(len(word1) 1)] for i in range(len(word1) 1): dp[i][0] i for j in range(len(word2) 1): dp[0][j] j for i in rang…

OpenStack平台Nova管理

1. 规划节点 使用OpenStack平台节点规划 IP主机名节点192.168.100.10controller控制节点192.168.100.20compute计算节点 2. 基础准备 部署的OpenStack平台 1. Nova运维命令 &#xff08;1&#xff09;Nova管理安全组规划 安全组&#xff08;security group&#xff09;是…