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

加油!

相关推荐
架构文摘JGWZ29 分钟前
Java 23 的12 个新特性!!
java·开发语言·学习
小齿轮lsl34 分钟前
PFC理论基础与Matlab仿真模型学习笔记(1)--PFC电路概述
笔记·学习·matlab
Aic山鱼1 小时前
【如何高效学习数据结构:构建编程的坚实基石】
数据结构·学习·算法
qq11561487071 小时前
Java学习第八天
学习
天玑y1 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
2301_789985942 小时前
Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
java·开发语言·学习
橄榄熊2 小时前
Windows电脑A远程连接电脑B
学习·kind
web_learning_3213 小时前
source insight学习笔记
笔记·学习
Lossya3 小时前
【机器学习】参数学习的基本概念以及贝叶斯网络的参数学习和马尔可夫随机场的参数学习
人工智能·学习·机器学习·贝叶斯网络·马尔科夫随机场·参数学习
Joeysoda4 小时前
Java数据结构 时间复杂度和空间复杂度
java·开发语言·jvm·数据结构·学习·算法