嵌入式学习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 }

由于str32属于局部变量在执行完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语言的学习也快要结束了。指针总体偏难,还有待加强学习。

加油!

相关推荐
千寻xun1 小时前
一、理论篇-NVME协议学习笔记
笔记·学习·fpga开发·nvme ssd·nvme协议
researcher-Jiang2 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
MartinYeung56 小时前
[论文学习]大语言模型安全综述:攻击、防御、对齐、度量与护栏的深度解析
学习·安全·语言模型
AOwhisky7 小时前
Python 学习笔记(第三期)——流程控制:条件判断与循环结构
运维·笔记·python·学习·云原生·流程控制·循环
心中有国也有家7 小时前
AtomGit Flutter 鸿蒙客户端:白噪音场景的视觉设计
学习·flutter·华为·harmonyos
心中有国也有家8 小时前
AtomGit Flutter 鸿蒙客户端:呼吸练习的完整生命周期
学习·flutter·华为·harmonyos
Zeeland8 小时前
构建护城河:自学习 Agent
学习
尼米棕熊8 小时前
大模型学习8上-推理部署框架llama.cpp与Ollama使用指北
学习·llama
brave_zhao8 小时前
nginx的进程架构
java·学习·nginx
枫零NET8 小时前
跟着OpenCode学习Pi Coding Agent-05-Agent的类型系统
人工智能·学习