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

加油!

相关推荐
小新同学^O^8 小时前
简单学习 --> 模型参数
学习·llm·大模型参数
cdbqss18 小时前
VB2026 菜单生成基类 BqGetMenuStrip
数据库·经验分享·学习·oracle·vb
吃好睡好便好10 小时前
创建魔方矩阵和单位矩阵
开发语言·人工智能·学习·线性代数·matlab·矩阵
星夜夏空9910 小时前
STM32单片机学习(21) —— I2C通信
stm32·单片机·学习
searchforAI12 小时前
B站视频转笔记用哪个工具?2026年四款AI笔记工具对比实测
人工智能·经验分享·笔记·gpt·学习·视频总结·ai笔记
爱上好庆祝13 小时前
学习JS第十一天(JS的进阶)
前端·javascript·学习
yeiweilan13 小时前
AI应用学习
学习
吃好睡好便好13 小时前
矩阵的加减运算
开发语言·人工智能·学习·线性代数·算法·matlab·矩阵
Mister西泽13 小时前
C++ Primer Plus 第六版 编程练习题及详细答案
开发语言·c++·学习·visual studio
Simon5231414 小时前
Spring Bean----5.27学习小记
java·学习·spring