嵌入式学习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.注意

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

  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.练习

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

#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.格式

int (*fun)(int, int);

3.3.存储

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

3.4.练习

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

#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.格式

void *p = 0x2000;

4.4.注意点

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

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

五、构造类型

5.1.结构体

        1.定义 

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

         2.变量的定义 

数据类型(struct 结构体名)   变量名;  

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

        3.成员的访问

  .  :结构体变量类型访问成员变量
  -> :结构体指针类型访问成员变量 

5.2.共同体(联合体)

5.3.枚举 

六、总结

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

        加油! 

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值