嵌入式学习Day13---C语言提升

目录

一、二级指针

1.1.什么是二级指针

2.2.使用情况

2.3.二级指针与数组指针

二、指针函数

2.1.含义

2.2.格式

2.3.注意

2.4.练习

三、函数指针

3.1.含义

3.2.格式

3.3.存储

3.4.练习

​编辑

四、void*指针

4.1.void缺省类型

4.2.void*

4.3.格式

4.4.注意点

五、构造类型

5.1.结构体

1.定义

2.变量的定义

3.成员的访问

5.2.共同体(联合体)

5.3.枚举

六、总结


一、二级指针

1.1.什么是二级指针

指向指针的的指针

2.2.使用情况

1.当函数内部想要修改外部的指针变量时,传入二级指针参数才能修改;

2.指针数组的数组名是指向指针数组得一个元素的指针也就是二级指针;

2.3.二级指针与数组指针

1.指针数组传参时传的是二级指针和长度;

2.二维数组传参时传的是数组指针和长度;

二、指针函数

2.1.含义

指针函数是函数,返回值是指针 ;

2.2.格式

复制代码
int *fun(int x, int y);

2.3.注意

指针函数不能返回局部变量的地址

cpp 复制代码
  1 #include <stdio.h>                                                          
  2 
  3 char *fun(void)
  4 {
  5     char str[32] = {"hello world"};
  6 
  7     return str;
  8 }
  9 
 10 
 11 int main(void)
 12 {
 13 
 14     char *p = NULL;
 15 
 16     p = fun();
 17 
 18     printf("p = %s\n", p);
 19 
 20     return 0;
 21 }

由于str[32]属于局部变量在执行完fun函数后,空间就被回收了。

2.4.练习

自己定义一个指针函数,来实现字符串的复制。

cpp 复制代码
#include <stdio.h>


char *MyStrCpy(char *pstr, char *pdst)
{
	char *pp = pstr;

	while(*pdst != '\0')
	{
		*pstr = *pdst;
		pstr++;
		pdst++;
	}

	*pstr = '\0';
	return pp;
}

int main(void)
{		
	char str[32] = {0};
	char dst[32] = {0};

	MyStrCpy(str, "hello world");
	MyStrCpy(dst, MyStrCpy(str, "hello world"));

	printf("str = %s\n", str);
	printf("dst = %s\n", dst);

	
	return 0;
}

三、函数指针

3.1.含义

函数指针是指针,指向一个函数

3.2.格式

cpp 复制代码
int (*fun)(int, int);

3.3.存储

占8字节,因为任何指针都占8字节

3.4.练习

使用函数指针来完成,由使用者意的愿来实现降序还是升序来实现冒泡排序

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int InPutNum(int *p, int len)
{
	int i = 0;

	srand(time(NULL));
	
	for(i = 0; i < len; i++)
	{
		p[i] = rand() % 200 -100;
	}

	return 0;
}

int OutPutNum(int *p, int len)
{
	int i =0;

	for(i = 0; i < len; i++)
	{
		printf("%d ", p[i]);
	}
	printf("\n");
	return 0;
}

int BullSort(int *p, int len, int (*pfun)(int, int))
{
	int i = 0;
	int j = 0;
	int tmp = 0;

	for(j = 0; j < len-1; j++)
	{
		for(i = 0; i < len-1-j; i++)
		{
			if(pfun(p[i], p[i+1]) > 0)
			{
				tmp = p[i];
				p[i] = p[i+1];
				p[i+1] = tmp;
			}
		}
	}
}

int aso(int x, int y)
{
	if(x > y)
	{
		return 1;
	}

	return 0;
}

int des(int x, int y)
{
	if(x < y)
	{
		return 1;
	}

	return 0;
}

int absdes(int x, int y)
{
	if(abs(x) < abs(y))
	{
		return 1;
	}

	return 0;
}

int main(void)
{
	int a[5] = {0};

	InPutNum(a, 5);
	OutPutNum(a, 5);
	BullSort(a,5,absdes);
	OutPutNum(a, 5);
	return 0;
}

四、void*指针

4.1.void缺省类型

4.2.void*

只表示类型地址,没有指向空间大小的含义;

主要用于函数传参和返回值使用;

4.3.格式

cpp 复制代码
void *p = 0x2000;

4.4.注意点

char *、int *、double * 转换为void *时需要强制类型转换;

void *转换为char *、int *、double *时不需要强制类型转换;

五、构造类型

5.1.结构体

1.定义

cpp 复制代码
struct 结构体名 
        {
            数据类型1 成员变量1;
            数据类型2 成员变量2;
            数据类型3 成员变量3;
            ...
        };

2.变量的定义

cpp 复制代码
数据类型(struct 结构体名)   变量名;  

变量的类型取决于结构体中的成员变量的类型

3.成员的访问

cpp 复制代码
  .  :结构体变量类型访问成员变量
  -> :结构体指针类型访问成员变量 

5.2.共同体(联合体)

5.3.枚举

六、总结

2024年7月25日,嵌入式学习第13天。今天终于是结束了指针的所有知识,开始了构造类型的学习,C语言的学习也快要结束了。指针总体偏难,还有待加强学习。

加油!

相关推荐
1024小神19 分钟前
SVG标签中path路径参数学习
学习
浅念-34 分钟前
C++入门(2)
开发语言·c++·经验分享·笔记·学习
ZH154558913135 分钟前
Flutter for OpenHarmony Python学习助手实战:面向对象编程实战的实现
python·学习·flutter
简佐义的博客1 小时前
生信入门进阶指南:学习顶级实验室多组学整合方案,构建肾脏细胞空间分子图谱
人工智能·学习
近津薪荼1 小时前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
rannn_1111 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
张人玉2 小时前
VisionPro 定位与卡尺测量学习笔记
笔记·学习·计算机视觉·vsionprp
觉醒大王2 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
YCY^v^3 小时前
JeecgBoot 项目运行指南
java·学习
云小逸3 小时前
【nmap源码解析】Nmap OS识别核心模块深度解析:osscan2.cc源码剖析(1)
开发语言·网络·学习·nmap