嵌入式学习第二篇——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;
}
相关推荐
挥剑决浮云 -4 分钟前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记
丶Darling.20 分钟前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
一颗星星辰1 小时前
C语言 | 第十章 | 函数 作用域
c语言·开发语言
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂1 小时前
实验4 循环结构
c语言·算法·基础题
小O_好好学1 小时前
CentOS 7文件系统
linux·运维·centos
从0至11 小时前
力扣刷题 | 两数之和
c语言·开发语言
x晕x2 小时前
Linux dlsym符号查找疑惑分析
linux·运维·服务器
小比卡丘2 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
一个不知名程序员www2 小时前
leetcode第189题:轮转数组(C语言版)
c语言·leetcode