Linux C基础笔记(4)终结篇

本文档详细介绍了Linux环境下C语言的高级特性,包括指针的概念与操作、指针与数组的关系、函数的定义与调用方式等内容,并对递归函数、指针函数和函数指针进行了深入探讨。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux C基础笔记(4)终结篇

补充申明:Linux C基础笔记共分为四部分,第一部分是Linux下基本命令,以及vi编辑器的使用还有C中的数据类型,第二部分为运算符、常量变量和输入输出。第三部分是控制语句、数组、字符串函数。第四部分为指针、函数以及分配内存管理。在写完这四部分之后我会继续上传数据结构、IO、以及网络编程的学习笔记,大家如果有需要学习Linux下编程的可以关注一下,我会将我所有的学习笔记发布在此供大家一起学习。(在笔记里面会有一些其他博主的总结,如果涉及到实属抱歉,您可以通过邮箱联系我,我会及时修改。1509965601@qq.com)。

  • 指针

- 【1】定义

	在计算机内部存储器(简称内存)中,每一个字节单元,都有一个编号,称为地址。
在C语言中,内存单元的地址称为指针,专门用来存放地址的变量,称为指针变量(pointer variable)。
在不影响理解的情况中,有时对地址、指针和指针变量不区分,通称指针。

  一般形式 :<存储类型><数据类型> *<指针变量> = <地址量>  
	int a, *p = &a;  ==  int *p; p=&a;

【2】&和*

&:取一个变量的地址,常量不能取地址
*:在定义指针变量的时候,起到标识作用,标识定义的是一个指针变量
   其他地方都表示取地址的内容

【3】指针变量的运算

指针变量的运算依据指针变量的类型来决定

【4】指针的运算

指针运算是以指针变量所存放的地址量作为运算而进行的运算
指针运算的实质就是地址的计算
指针运算的种类是有限的,他只能进行赋值运算、算术运算和关系运算。

int *p;
p + n  向地址大的方向移动n个数据
p + 1  向地址大的方向移动4个地址(一个数据类型的大小)
p - 1  向地址小的方向移动4个地址	
p++    自增  向地址大的方向移动1个数据
p--    自减
p - q  两个地址之间相隔数据元素的个数

注意:不同数据类型的两个指针实行加减整数运算是无意义的。

【5】指针与数组

数组指针: 实际上是一个指针,该指针指向一个数组		int (*arr)[4];	int a[3][4]; int (*p)[4];	  arr指向含有4个int型元素的一维数组变量整体,其类型为可存储4个int型数据的数据类型。 

指针数组:(将多个字符串赋值给数组时,选用) 实际是一个数组,数组的每个元素存放的是一个指针类型的元素 	int* p[8]; int a[8][3]; p[1] = a[1];	p是一个指针含有8个int*的数组,数组元素类型是int指针类型。

指针与一维数组 
	int a[4], *p;
	p = a; p = &a[0];
	a[i] <=> *(a + i) <=> *(p + i) <=> p[i]

例子: main()
	{
		int a[5] = {1,2,3,4,5};
		int *p = (int *)(&a + 1);
		printf("%d %d0",*(a+1),*(p-1))
	}

	输出  2  5



指针与二维数组
	int a[3][4]; int (*p)[4];<=> int *p = &a[0][0]

	&a 	地址升级,指向整个数组		&a+1 移动整个数组大小的字节
	a 	行指针,指向一行
	*a 	列指针,地址的降级,指向一个数据
	
	*a = a[0];
	a[i][j] <=> *(*(a + i) + j) <=> *((p + i) + j)<=>p[i][j];
	p = a[0] = &a[0][0];

【6】字符指针与字符串

初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针中	
当一个字符指针指向一个字符串常量时,不能修改指针指向的对象值  

  可修改
char str[] = "hello";
char *p = str;
  不可修改
char *p = "hello

char ch1[] = "hello";
char ch2[] = "hello";
char *p;
p = ch1 / p = ch2; 其中ch1和ch2的地址不同

char *p = "hello";
char *q = "hello"; 其中p和q的地址一样
  • 函数

【1】定义

函数是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值。
一般形式如下:
<返回值类型>  <函数名称>( <形式参数说明> )
{
    语句序列;
	return[(<表达式>)];
} 

【2】函数的参数传递方式:

值传参
地址传参

【3】函数的数组传参方式

int a[4];
void order(int a[],int size);
void order(int *a);

从函数返回数组
	C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。

	int * getRandom( )
	{
		static int  r[10] = {1,2,6,6,5,4,4};
		  return r;
	}
	
	int main ()
	{	
		/* 一个指向整数的指针 */
		int *p;
		int i;

		 p = getRandom();
		 for ( i = 0; i < 10; i++ )
		{
 				  printf( "*(p + %d) : %d\n", i, *(p + i));
		 }

		 return 0;
	}
	这个方法实际是我们下面讲到的指针函数。

【4】递归函数

C 语言支持递归,即一个函数可以调用其自身。但在使用递归时,程序员需要注意定义一个从函数退出的条件,否则会进入死循环。
递归函数在解决许多数学问题上起了至关重要的作用,比如计算一个数的阶乘、生成斐波那契数列,等等。

#include <stdio.h>
double fun( int i)
{
 	if(i <= 1)
{
  		return 1;
  }
	 return i * fun(i - 1);
}
int  main()
{
	 int i = 10;
	 printf("%d 的阶乘为 %f\n", i, fun(i));
	 return 0;
}

【5】指针函数

如果一个函数的返回值是指针,则称函数为指针函数。
	char *mystring(void)
	{
		static char str[N];
		 char *str = "hello";  //此str 不可修改
		return str;
	}

【6】函数指针

函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。

函数指针变量的声明: typedef int (*fun_ptr)(int,int);

int max(int x, int y)
{
		return x > y ? x : y;
}

int main(void)
{
 /* p 是函数指针 */
	 int (* p)(int, int) = & max; // &可以省略
	 int a, b, c, d;

	 printf("请输入三个数字:");
		scanf("%d %d %d", & a, & b, & c);

 /* 与直接调用函数等价,d = max(max(a, b), c) */
	 d = p(p(a, b), c); 

	 printf("最大的数字是: %d\n", d);

	 return 0;
}

【7】回调函数

函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
// 回调函数
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
	 for (size_t i=0; i<arraySize; i++)
   		 array[i] = getNextValue();
}

// 获取随机值
int getNextRandomValue(void)
{
	 return rand();
}

int main(void)
{
		int myarray[10];
	populate_array(myarray, 10, getNextRandomValue);
	for(int i = 0; i < 10; i++) {
    		printf("%d ", myarray[i]);
	 }
		printf("\n");
		return 0;
}

#include<stdio.h>
int fun(int a,int b)
{
	int c;
	c = a+b;
	return c;
}

int fun1(int a,int c,int d,int (*fun)(int a,int b))
{
	int sum;
	sum = a + fun(c,d);
	return sum;
}

int main()
{
	int sum;
	sum = fun1(10,2,1,fun);
	printf("%d\n",sum);

}

因为时间关系,今天的笔记就码到这里,给大家说好的还有动态分配空间我会放到后边的结构体里。(小声哔哔:反正也没人看。(꒦_꒦) )

1. 用户权限管理模块 角色管理: 学生:查看实验室信息、预约设备、提交耗材申请、参安全考核 教师:管理课题组预约、审批学生耗材申请、查看本课题组使用记录 管理员:设备全生命周期管理、审核预约、耗材采购分发、安全检查 用户操作: 登录认证:统一身份认证(对接学号 / 工号系统,模拟实现),支持密码重置 信息管理:学生 / 教师维护个人信息(联系方式、所属院系),管理员管理所有用户 权限控制:不同角色仅可见对应功能(如学生不可删除设备信息) 2. 实验室设备管理模块 实验室信息管理: 基础信息:实验室编号、名称、位置、容纳人数、开放时间、负责人 功能分类:按学科(计算机实验室 / 电子实验室 / 化学实验室)标记,关联可开展实验类型 状态展示:实时显示当前使用人数、设备运行状态(正常 / 故障) 设备管理: 设备档案:名称、型号、规格、购置日期、单价、生产厂家、存放位置、责任人 全生命周期管理: 入库登记:管理员录入新设备信息,生成唯一资产编号 维护记录:记录维修、校准、保养信息(时间、内容、执行人) 报废处理:登记报废原因、时间,更新设备状态为 "已报废" 设备查询:支持按名称、型号、状态多条件检索,显示设备当前可用情况 3. 预约使用模块 预约管理: 预约规则:学生可预约未来 7 天内的设备 / 实验室,单次最长 4 小时(可设置) 预约流程:选择实验室→选择设备→选择时间段→提交申请(需填写实验目的) 审核机制:普通实验自动通过,高危实验(如化学实验)需教师审核 使用记录: 签到 / 签退:到达实验室后扫码签到,离开时签退,系统自动记录实际使用时长 使用登记:填写实验内容、设备运行情况(正常 / 异常),异常情况需详细描述 违规管理:迟到 15 分钟自动取消预约,多次违规限制预约权限 4. 耗材安全管理模块 耗材管理: 耗材档案:名称、规格、数量、存放位置、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值