嵌入式学习第二篇——C语言基础12

目录

指针

1.const指针

2.void

3.函数指针和指针函数:

1.指针函数:

2.函数指针:

4.C语言中二级指针使用场景:

1.指针数组传参时:

2.函数体内想修改函数体外指针变量值的时

构造数据类型:

数据类型:

1.基本数据类型:

[1, int](#1, int)

2,double

3,char

4,等等

2.构造数据类型:

[1.struct 结构体](#1.struct 结构体)

[2.union 共用体](#2.union 共用体)

[3.enum 枚举](#3.enum 枚举)

1.结构体:

1.结构体类型的定义

2.结构体变量的定义

3.结构体变量的初始化:

1.全部初始化:

2.局部初始化:

4.结构体成员变量的访问:

作业:


指针

1.const指针

定义形式:

const 关键字 常量(只读) readonly

1.const int *p;

2.int const *p;

3.int *const p;

4.const int *const p;

5.int const *const p;

1和2是等价的

const修饰 *p,指针变量p 的值可以改变 ,但不能 利用指针修改 指向空间中的值

3

const修饰 p,指针变量p 的值不能改变 ,但可以 利用指针变量p修改 指向空间中的值

一定要对指针初始化

4和5是等价的

const修饰p和*p,指针变量p 的值不能改变 ,也不能 利用*p改变 直系那个空间中的值

一定要初始化

参考如下:

cpp 复制代码
#include<stdio.h>

int main(void)
{
	const int *p = NULL;
	int const *q = NULL;
	int a = 300;
	int *const m = &a;
	const char *const n = "how";
	char const *const v = "are";
	

	p = &a;
	q = &a;

	printf("*P = %d *q = %d\n",*p,*q);
	printf("*m = %d\n",*m);
	
	*m = 200;

	printf("*P = %d *q = %d\n",*p,*q);
	printf("*m = %d\n",*m);
	

	return 0;
}

2.void

void a;

高精度

int *p;

double *p;

char *p;

低精度

void *p;

p保存内存地址

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

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

strcpy -> 拷贝字符串

memcpy -> 拷贝一段内存空间

参考如下:

cpp 复制代码
#include<stdio.h>

char *fun(void)
{
	char *str = {"hello world"};
//	char str[32] = {"hello world"};
	return str;
}



int main(void)
{
	char *p = NULL;

	p = fun();

	printf("p = %s\n",p);

	return 0;
}

3.函数指针和指针函数:

指针函数:是函数,函数的返回值类型是指针类型

函数指针:是指针,指针指向了函数

1.指针函数:

局部变量的地址 不能返回,因为局部变量会随函数作用域结束被回收,虽然能够获得返回的地址,但地址对应的空间已经被回收过了

将函数的返回值 作为下一个函数的参数

参考如下:

cpp 复制代码
#include<stdio.h>
#include<string.h>

char *fun(char *p,const char *q)
{
	char *o = p;

	while(*q != '\0')
	{
		*p = *q;
		p++;
		q++;
	}
	*p = '\0';

	return o;
}


int main(void)
{
	char str1[32] = {0};
	char str2[32] = {0};

	fun(str2,fun(str1,"hello world"));
	printf("str1 = %s str2 = %s\n",str1,str2);

	strcpy(str2,strcpy(str1,"how are you"));
	printf("str1 = %s str2 = %s\n",str1,str2);

	return 0;
}

2.函数指针:

定义形式:

int (*Fun)(int a, int b) = NULL;

定义函数指针变量 Fun,占8 个字节空间,指向int返回值有2个int参数的函数

参考如下:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>

#define N jjiang

int Inputa(int *pa,int len)
{
	int i = 0;
	for(i = 0;i < len;i++)
	{
		scanf("%d",&pa[i]);
	}
	return 0;
}

int Outputa(int *pa,int len)
{
	int i = 0;
	for(i = 0;i < len;i++)
	{
		printf("%d ",pa[i]);
	}
	printf("\n");
	return 0;
}

int Sorta(int *pa,int len,int (*pcmp)(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(pcmp(pa[i],pa[i+1]))
			{
				tmp = pa[i];
				pa[i] = pa[i+1];
				pa[i+1] = tmp;
			}
		}
	}
	return 0;
}

int sheng(int num1,int num2)
{
	if(num1 > num2)
	{
		return 1;
	}

	return 0;
}

int jiang(int num1,int num2)
{
	if(num2 > num1)
	{
		return 1;
	}

	return 0;
}

int jsheng(int num1,int num2)
{
	if(abs(num1) > abs(num2))
	{
		return 1;
	}
	return 0;
}

int jjiang(int num1,int num2)
{
	if(abs(num2) > abs(num1))
	{
		return 1;
	}
	return 0;
}


int main(void)
{
	int a[5] = {0};

	Inputa(a,5);
	Sorta(a,5,N);
	Outputa(a,5);

	return 0;
}

4.C语言中二级指针使用场景:

1.指针数组传参时:

定义形式:

char *str[5];

int Fun(char **ppstr, int len);

2.函数体内想修改函数体外指针变量值的时

要传递指针变量的地址即二级指针

char *p = NULL;

int Fun(char **pp);

参考如下:

cpp 复制代码
#include<stdio.h>

void fun(char **p)
{
	*p = "hello world!";

	return;
}


int main(void)
{
	char *p = NULL;

	fun(&p);

	printf("p = %s\n",p);

}

==================================================================================================================================================

构造数据类型:

数据类型:

1.基本数据类型:

1, int
2,double
3,char
4,等等

2.构造数据类型:

1.struct 结构体
2.union 共用体
3.enum 枚举

1.结构体:

1.结构体类型的定义

struct 结构体名

{

数据类型1 成员变量1;

数据类型2 成员变量2;

数据类型3 成员变量3;

..

};

2.结构体变量的定义

数据类型 变量名;

数据类型 *指针变量名;

3.结构体变量的初始化:

1.全部初始化:

struct student s = {"zhangsan", 'm', 19, 100};

2.局部初始化:

struct student stu = {

.name = "lisi",

.score = 90,

};

参考如下:

cpp 复制代码
#include<stdio.h>

struct time
{
	int hour;
	int min;
	int sec;
};

struct date
{
	int year;
	int mon;
	int day;
};

struct datetime 
{
	struct time t;
	struct date d;
};

struct yusuan
{
	int jia;
	int jian;
	int cheng;
	int chu;
}ys;


int main(void)
{
	struct yusuan ys = {1,2,3,4};	
	struct datetime dt = {{15,54,30},{2024,1,29}};
	struct date da = {
						.year = 2024,
						.mon = 1,
					};
	struct datetime *p = NULL;
	struct time ti = {16,33,10};

	p = &dt;

	printf("%d:%d:%d\n",ti.hour,ti.min,ti.sec);

	printf("%d-%d-%d-%d:%d:%d\n",dt.d.year,dt.d.mon,dt.d.day,dt.t.hour,dt.t.min,dt.t.sec);

	printf("%d----%d\n",p->d.year,p->t.hour);

	return 0;
}

4.结构体成员变量的访问:

. :结构体变量类型 访问成员变量使用**.**

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

整体类型由成员变量类型决定

参考如下:

cpp 复制代码
#include<stdio.h>
#include<string.h>

struct stduent
{
	char name[32];
	char sex;
	int age;
	int score;
};


int main(void)
{
	struct stduent s;

	memset(&s,0,sizeof(s));

	gets(s.name);

	s.sex = getchar();

	scanf("%d%d",&s.age,&s.score);

	printf("姓名:%s\n性别:%c\n年龄:%d\n成绩:%d\n",s.name,s.sex,s.age,s.score);

	return 0;
}

作业:

1.定义一个结构体包含年-月-日三个成员

struct date

{

int year;

int mon;

int day;

};

从终端接收年月日信息存放到结构体中,计算该天为该年的第几天?计算该年剩余多少天?打印年月日信息

2.封装一个函数,给定一个数字字符串转换成其对应的整形数

"123456"

123456

int MyAtoi(char *pstr);

1,

cpp 复制代码
#include<stdio.h>
#include<string.h>


struct date
{
	int year;
	int mon;
	int day;
};

int main(void)
{
	int panduan = 0;
	int sum = 0;
	int last = 0;
	int i = 0;
	int a[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	struct date d;
	memset(&d,0,sizeof(d));

	scanf("%d%d%d",&d.year,&d.mon,&d.day);

	if(d.year % 4 == 0 && d.year % 100 != 0 || d.year % 400 == 0)
	{
		panduan = 1;
	}

	if(panduan == 1)
	{
		a[2] = 29;
	}
	
	for(i = 0;i < d.mon;i++)
	{
		sum += a[i];
	}
	sum += d.day;

	last = 356 - sum;

	if(panduan == 1)
	{
		last = 366 - sum;
	}

	printf("%d-%d-%d为该年第%d天,该年还剩%d天\n",d.year,d.mon,d.day,sum,last);

	return 0;
}

2,

cpp 复制代码
#include<stdio.h>
#include<string.h>

int MyAtoi(char *pa)
{
	int sum = 0;
	int len = strlen(pa);
	while(*pa != '\0')
	{
		sum = sum * 10 + (*pa - 48);
		pa++;
	}
	return sum;
}


int main(void)
{
	char a[64] = {0};
	int b = 0;

	gets(a);

	b = MyAtoi(a);

	printf("%d\n",b);

	return 0;
}
相关推荐
怀民民民12 小时前
关于ADC
单片机·嵌入式硬件·fpga开发·adc·学习总结·模数转化
IT阳晨。12 小时前
【STM32】DMA
stm32·单片机·嵌入式硬件
Aaron158812 小时前
通用的通感控算存一体化平台设计方案
linux·人工智能·算法·fpga开发·硬件工程·射频工程·基带工程
讨厌下雨的天空12 小时前
缓冲区io
linux·服务器·前端
musk121212 小时前
人工智能学习大纲,豆包深入研究版
人工智能·学习
dvvvvvw12 小时前
展开式求和.c
c语言
知南x12 小时前
【Socket消息传递】(1) 嵌入式设备间Socket通信传输图片
linux·fpga开发
胡童嘉12 小时前
长沙烈焰鸟网络科技有限公司实习day13日记
功能测试·学习·职场和发展·游戏引擎·cocos2d
雾削木12 小时前
FLASH ARM内核 SRAM RCC ADC I/O
arm开发·单片机·嵌入式硬件
linly121912 小时前
ERP学习笔记-时域分析
笔记·学习