嵌入式学习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语言的学习也快要结束了。指针总体偏难,还有待加强学习。

加油!

相关推荐
Chef_Chen4 小时前
从0开始学习R语言--Day18--分类变量关联性检验
学习
键盘敲没电5 小时前
【IOS】GCD学习
学习·ios·objective-c·xcode
海的诗篇_5 小时前
前端开发面试题总结-JavaScript篇(一)
开发语言·前端·javascript·学习·面试
AgilityBaby5 小时前
UE5 2D角色PaperZD插件动画状态机学习笔记
笔记·学习·ue5
AgilityBaby5 小时前
UE5 创建2D角色帧动画学习笔记
笔记·学习·ue5
武昌库里写JAVA7 小时前
iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
java·开发语言·spring boot·学习·课程设计
一弓虽8 小时前
git 学习
git·学习
Moonnnn.10 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
viperrrrrrrrrr711 小时前
大数据学习(131)-Hive数据分析函数总结
大数据·hive·学习
fen_fen11 小时前
学习笔记(26):线性代数-张量的降维求和,简单示例
笔记·学习·算法