C语言深度解析:函数的形参和实参与传值和传址(多角度分析,让你有一种相见恨晚的感觉!!!!)

news2025/2/22 13:14:25

目录

一、前言

二、函数的形参和实参

🍑实参

🍎形参 

🍇形参与实参之间的区别 

🍐形参与实参之间的联系(重点!!!!) 

 三、函数的传值和传址(超重点!!!)

🍒例题分析

🍍错误分析 

🥝 错误修改

🍋 深入理解 值传递与址传递

 💦概念理解

四、进阶练习(公司面试题)

🍈题目 

🍓 题目分析与改正

五、总结

六、共勉


一、前言

在C语言中指针与函数的结合是一件很麻烦的事情,用起来总是丈二和尚,摸不着头脑,特别是在参数传递,申请空间等,把我折磨的是一头雾水。也许大家对于这些知识都是一知半解(除过一些大佬O),没有真正的去搞透彻,一问我都会(这就是我),但是真正引用的时候就会出现很多问题,而且百度的时候又看不懂,所以为了帮助大家解决这个问题(实际上是自己不会),在这里进行一个全面的介绍(形参和实参与传值和传址)。

 

二、函数的形参和实参

🍑实参

知识点1:实参(实际参数)

🔑在调用有参函数时,函数名后面括号中的参数被称为“实参”,通俗的来讲,就是我们真实传递给函数的参数。

🔑实参可以表示为:常量、变量、表达式、函数等。

🔑无论实参是何种类型的量,在进行函数调用时,他们必须有确定的值,以便于把这些值传递给形参。

💦代码举例解析

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
int add(int x, int y)  //加法函数
{
	int sum = 0;
	sum = x + y;
	return sum;
}
int main()
{
	int a = 0, b = 0;
	printf("请输入a,b的值:\n");
	scanf("%d %d", &a, &b);
	// 真实传递给函数的参数就是实参
	int sum1 = add(1, 2);  // 实参可以是常量
	printf("输出1 + 2 的和:");
	printf("%d\n", sum1);

	int sum2 = add(a, b); // 实参可以是变量
	printf("输出a + b 的和:");
	printf("%d\n", sum2); 

	int sum3 = add(a + b, a - b); //实际参数可以是表达式
	printf("输出(a+b)与(a-b)的和:");
	printf("%d\n", sum3);

	int sum4 = add(add(a, b), 6); //实际参数可以是函数
	printf("输出函数(2+3)+5的和:");
	printf("%d\n", sum4);
	return 0;
}

💦结果输出

🍎形参 

知识点2:形参(形式参数)

🔑形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的和过程中才实例化(分配内存单元),所以叫形式参数。

🔑形参出现在函数定义中,在整个函数体内都可以使用,离开函数则不能使用

🔑形参没有确定的值

通俗的来讲:形参定义时,编译系统并不为其分配存储空间,也没有初始值,只是在函数调用时,临时分配存储空间,接受来自实参的值。函数调用结束,内存空间释放,值消失。

💦代码举例解析:还是用上面的代码测试

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
int subtraction(int x, int y) // 注意:此时在subtraction函数里的 x,y就是形式参数
{
	return x - y;
}
int main()
{
	int a, b;
	printf("请输出a,b的值:\n");
	scanf("%d %d", &a, &b);
	printf("请输出a-b的值:");
	int sum = 0;
	sum = subtraction(a, b);
	printf("%d\n", sum);
	return 0;
}

🔑注意:

形参只有在函数中有效

    

形参在函数调用之前还未创建

函数调用过程中,形参才被实例化

函数调用结束,形参生命周期结束,形参会被立刻销毁

 💦结果输出

  

🍇形参与实参之间的区别 

知识点3:形参与实参之间的区别

🍐形参与实参之间的联系(重点!!!!) 

知识点4:形参与实参之间的联系

💦在讲到形参与实参的联系,这里就牵扯出了函数调用的两大类(不同的类别,形参与实参之间的联系就不同)

🔑 调用

官方理解: 函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参

通俗的理解:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参)

🔑 调用

官方理解

▶ 传值调用是把函数外部创建的内存地址传递给函数参数的一种调用函数的方式

▶ 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量

通俗的理解:形参为指向实参地址的指针,当对形参进行指向操作时,就相当于实参本身进行的操作。

💦讲到这里大家肯定会有疑问,那么什么时候用传值调用,什么时候用传址调用,怎么用呢?

接下来我将回答大家依次解答。

 三、函数的传值和传址(超重点!!!)

🍒例题分析

在理解传值调用传址调用的之前我们先来看一道题目,从题目中区分他们之间的联系

例题:写一个函数可以交换两个整型变量的内容

例如:

交换前:20 30
交换后:30 20

代码展示:用函数的方式书写:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
//交换函数  
void Swap1(int x, int y)  // 其中 x ,y 是形参
{
	int z = 0;
	z = x;
	x = y;
	y = z;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);
	//交换两个变量
	printf("交换前: a=%d b=%d\n", a, b);

	Swap1(a, b);        // 其中 a , b 是实参

	printf("交换后: a=%d b=%d\n", a, b);

	return 0;
}

💦看看运行结果:

20 30   // 输入 a b 的值

交换前:a=20 b=30
交换后:a=20 b=30

 啊,看到这个结果,大家应该会大吃一惊吧,我们不是已经通过函数进行数值交换了吗?

怎么会出现的这样的结果呢?

不急,等我给大家娓娓道来哦。

🍍错误分析 

分析: 

主函数里面的Swap1(a, b)中的ab叫做实参(实际参数)

而当我们进到Swap1函数内部的时候,Swap1(int x, int y)中的xy叫做形参(形式参数)

所以我们在调用Swap1函数的时候,是不是把实际参数传给了形式参数

🔑这个时候结论是这样子的:

▶  当函数调用的时候,实参传给形参,形参其实是实参的一份临时拷贝

🔑此时大家又要问了,那什么是临时拷贝呢?

▶  形参有自己的独立空间,我们的操作只是把实参的内容拷贝一份,放到形参里面去了

🔑 所以我们想要的答案出现了

 ▶ 我们将实参的值拷贝给了形参

 ▶ 但是在 swap1() 函数中 形参的值发生了改变(进行了数值互换),可是实参的值却没有发生改变。

 ▶ 在swap1() 函数结束时,也无法将转换的值返回给实参 因为void():无返回值函数

 ▶ 根据形参的特性:形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

 ▶ 所以最终导致,实参并没有发生变化。

💦于此同时我将上面的代码进行改写,这个大家就能更好的理解,为什么会出错。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
void Swap1(int x, int y)
{
	int z = 0;
	z = x;
	x = y;
	y = z;
	printf("inside:形参为x,y\nx=%d,地址为%d\ny=%d,地址为%d\n\n", x, &x, y, &y);
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);

	//交换两个变量
	printf("before:实参为a,b\na=%d,地址为%d\nb=%d,地址为%d\n\n", a, &a, b, &b);

	Swap1(a, b);

	printf("after:实参为a,b\na=%d,地址为%d\nb=%d,地址为%d\n\n", a, &a, b, &b);

	return 0;
}

💦查看输出结果

20 30
before:实参为a,b
a=20,地址为-401606620
b=30,地址为-401606588

inside:形参为x,y
x=30,地址为-401606672
y=20,地址为-401606664

after:实参为a,b
a=20,地址为-401606620
b=30,地址为-401606588

🔑 通过结果中的展示,发现从形参x和y的地址来看,传递的是实参a和b的拷贝。对拷贝的修改不会改变实参的值

最终的结论:

🔑当函数调用的时候,实参传给形参,形参其实是实参的一份临时拷贝

注意:此时大家也会发现上面的代码实参a ,b传输的是 数值这种传递就叫做 值传递

🥝 错误修改

修改:

很明显,刚刚那个代码是错误的,那么如何修改呢?

在回想一下我们写过的函数:

▶ 写了一个Swap1函数,把a、b的值传给了x、y以后,x、y的空间和a、b的空间是独立的空间。

▶  所以对 a、b 的修改是不会影响 x、y 的,它们之间是 没有建立连接的
那么我们怎么让它们之间建立联系呢?

🔑 答案是 :指针

💦利用指针进行代码改写

 
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>
void Swap2(int *pa, int *pb)   // 其中 *pa *pb 是形参
{
	int z = 0;
	z = *pa;
	*pa = *pb;
	*pb = z;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);
	//交换两个变量
	printf("交换前: a=%d b=%d\n", a, b);

	Swap2(&a, &b);     // 此时传出过去的实参是 a,b数值的地址

	printf("交换后: a=%d b=%d\n", a, b);

	return 0;
}

💦察看运行结果

20 30

交换前:a=20 b=30
交换后:a=30 b=20

💦代码分析

     我们先创建了 a , b变量,a , b变量里面放入 20、30。

     我们将 a 的地址取出来(实参),放到 pa指针变量(形参)里面去。

     同样我们将 b 的地址取出来(实参),放到 pb指针变量(形参)里面去。

     此时地址 pa 就能找到 a, 地址 pb 就能找到 b。

▶  

    那么 *pa = a  , *pb = b  ,在定义一个z变量,用于交换 *pa 和*pb。

💦代码图解

 

 ✨得出结论:形参为指向实参地址的指针,当对形参进行指向操作时,就相当于实参本身进行的操作。

注意:此时大家也会发现上面的代码实参a ,b传输的是 地址这种传递就叫做 址传递。

🍋 深入理解 值传递与址传递

我们结合连两个代码一起来看看。

#include <stdio.h>
#include <stdlib.h>
void Swap1(int x, int y)
{
	int z = 0;
	z = x;
	x = y;
	y = z;
}

void Swap2(int *pa, int *pb)
{
	int z = 0;
	z = *pa;
	*pa = *pb;
	*pb = z;
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);

	//交换两个变量
	printf("交换前: a=%d b=%d\n", a, b);

	Swap1(a, b);

	Swap2(&a, &b);

	printf("交换后: a=%d b=%d\n", a, b);

	return 0;
}

🔑 当我去调用Swap1函数的时候,我把a、b本身的变量传到Swap1函数,这种方式叫:传值调用

🔑当我去调用Swap2函数的时候,我把a、b地址传到Swap2函数,这种方式叫:传址调用

 💦概念理解

想必大家看了我上面的讲解,对传值与传址调用有了一定的了解,下面我将给大家更加详细的总结。

如何在函数中区分 什么是传值调用,什么是传址调用呢?(估计细心的大家已经发现了)

🔑  当在主函数中,调用其他函数,实参为 数值 的时候 此时的函数调用被称为:传值调用

例如:

int main()
{
   int a , b;
   scanf("%d %d",&a,&b); 
   add(a,b);  //  传值调用
   
   int *x = &a;
   int *y = &b;
   add(x,y);  // 传值调用
}

注意:在代码中add(x,y),使用实参 x,y 是值传递,传递的是指针的值,而不是地址。

🔑当在主函数中,调用其他函数,实参为 地址 的时候 此时的函数调用被称为:传值调用

如何判断是地址呢?

在实参里面有取地址符(&)存在的时候,就证明是地址

例如:

int main()
{
   int a , b;
   scanf("%d %d",&a,&b); 
   add(&a,&b);  //  传址调用
   
   int *x = &a;
   int *y = &b;
   add(&x,&y);  // 传址调用
}

在我们自己写代码的时候,何时使用传值调用,何时使用传址调用呢

🔑 当要使用的函数,是对 实参本身 进行改变时--------使用传址调用

      注意:传址调用,大多数 无返回值 用 void();

// .写一个函数,每调用一次这个函数,就会将 num 的值增加1。
#include <stdio.h>
#include <stdlib.h>
void Add(int* p) {
	(*p)++;
}
int main() {
	int num = 0;
	Add(&num);//1
	printf("%d\n", num);
	Add(&num);//2
	printf("%d\n", num);
	Add(&num);//3
	printf("%d\n", num);
	Add(&num);//4
	printf("%d\n", num);
 
	return 0;
}

🔑 当要使用的函数,只是对实参的值做 加减乘除之类 的操作时---------使用传值调用

      注意:传值调用,大多数需要加上返回值 return ;

#include <stdio.h>
int add(int n, int m)
{
	return n + m;
}
int main()
{
	int a = 10;
	int b = 20;
	int sum = add(a, b);
	printf("sum=%d\n", sum);  // sum = 30
	return 0;
}

 

四、进阶练习(公司面试题

为了使大家更好的理解形参、实参、传值调用、传址调用,我们再次练习一道例题。

注意:很多公司在面试的时候,经常会在这里设置陷阱

🍈题目 

题目:下面这个代码有很多错误,将它的错误找出来,并且改正

#include <stdio.h>

void test(char *string)
{
	string = "hello world";
}
int main()
{
	char *str = NULL;
	test(str);
	printf("str=%s\n",str);
	
	return 0;
	
}

如果大家之前对形参、实参、传值调用、传址调用不清楚的话,要是要到题,估计很多人都会觉得代码是正确的 ,应该输出:str = hello world

🍓 题目分析与改正

💦首先将这段代码放在编译器中运行(面试的时候是不可以的哦,所以基础要打好O

 此时我们发现了 问题一 ,这个问题直接导致代码无法运行了

问题:无法从 const char [12]  转换为 char *  

🔑针对这个问题我们需要知道:

指针指向的常量存储区是不允许修改的,这个实参和形参的地址都是指向字符串的地址,是const类型的,所以不能转换。

💦进行代码修改

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <assert.h>
void test(char* string)
{
	 //string = "hello world";
	char arr[] = "hello world";  // 重新创建一个数组,将字符串赋值给它
	string = arr;  // 将 hello world 的地址传递给 string
}
int main()
{
	char* str = NULL;
	test(str);     // 传值调用
	printf("str=%s\n", str);  //   str=(null)
	return 0;
}

💦查看输出结果

输出:

str = (null)

此时我们发现程序不报错了,但是输出的结果与我们希望的结果副相符合,出现问题二

此时的问题终于回到我们这篇文章所讲解的知识体系上了。

很明显,此时函数调用是--------------------------传值调用

错误问题:当函数调用的时候,实参传给形参,形参其实是实参的一份临时拷贝

 形参是实参的一份拷贝,形参的改变,与实参毫无关系,所以导致输出null

💦进行代码修改 ---(使用---传值调用的方发修改--------加入返回值即可)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <assert.h>
char* test(char* string)
{
	 //string = "hello world";
	char arr[] = "hello world";
	string = arr;  // 将 hello world 的地址传递给 string
	return string;
}
int main()
{
	char* str = NULL;
	str = test(str);   // 接收返回的地址
	printf("str=%s\n", str);  //   str=烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫1
	return 0;
}

💦查看输出结果

输出:
str=烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫1

此时我们发现返回值有了,但是返回的结果与我们的结果不相符合,出现问题三

错误分析:此时我们再次发现,我在为了解决 问题一  创建了 arr 数组,当arr 数组出了test函数作用域就会自动销毁,所以打印出来的是随机值。

此时会有同学问,为什么会自动销毁呢?

因为arr数组是在 栈帧中创建的 一但出了作用域就会自动销毁。

此时我们就要想到用 malloc() 函数 在堆上创建数组,这样才不会被销毁

如果有不懂 malloc() 的老铁,可以去看我之前写的 动态内存分配 这一章节O

https://blog.csdn.net/weixin_45031801/article/details/127701311

💦进行代码修改

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <assert.h>
char* test(char* string)
{
	string = (char*)malloc(100);   // 在堆上创建数组
	strcpy(string, "hello world");  // 将数组的地址拷贝给string
	return string; // 返回 string 的地址
}
int main()
{
	char* str = NULL;
	str = test(str);
   	printf("str=%s\n", str);
	getchar();
	// 用完之后记得free,就可以解决内存泄露问题
	free(str);
    str = NULL; // 还要将str置为空指针
	return 0;
}

💦查看输出结果

输出:
str=hello world

这是可能还会有同学说,传值调用可以使代码正确,那传址调用可以吗?

当然可以啦!!

💦进行代码修改

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <assert.h>
void test(char** string)
{
	*string = (char*)malloc(100);
	strcpy(*string, "hello world");
}
int main()
{
	char* str = NULL;
	test(&str);         // 传址调用
   	printf("str=%s\n", str);
	//puts(str);
	getchar();
	// 用完之后记得free,就可以解决内存泄露问题
	free(str);
    str = NULL; // 还要将str置为空指针
	return 0;
}

💦查看输出结果

输出:
str=hello world

到此,这道题就被我们完整的解出来啦!!

五、总结

看到这里,估计大家已经对形参、实参、传值调用、传址调用完全掌握了把!

这里我将给大家列出通过这篇文章大家需要掌握的知识点。

知识点1:什么是实参?

知识点2:什么是形参?

知识点3:实参与形参的区别是什么?

知识点4:实参与形参的联系是什么?

知识点5:什么是传值调用?

知识点6:什么是传址调用?

知识点7:如何在函数中区分 什么是传值调用,什么是传址调用呢?

知识点8:在我们自己写代码的时候,何时使用传值调用,何时使用传址调用呢?

这些知识点,都可以这篇文章中找到,希望对大家有用(主要是怕自己忘记,狗头护体!)

  

六、共勉

以下就是我对函数的形参和实参与传值和传址的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对函数栈帧的创建和销毁的理解,请持续关注我哦!!!!! 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/42696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计JAVA网上宠物商店

[附源码]计算机毕业设计JAVA网上宠物商店 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

【html5期末大作业】基于HTML仿QQ音乐官网网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Xcode 中设置APP的图标(Icon)和启动页面(Launch Screen)

设置图标&#xff08;Icon&#xff09; 首先&#xff0c;要准备4组图标&#xff08;如果是发布在 iOS 平台上&#xff09;&#xff0c;这4组分别是 120 x 120 px&#xff0c;152 x 152 px&#xff0c;167 x 167 px&#xff0c;1024 x 1024 px 的尺寸&#xff0c;要 PNG 格式。…

使用EL表达式时,PropertyNotFoundException异常的解决过程

一. 业务场景 最近&#xff0c;杨哥的一个班级正在做基于JSPJSTL/EL Servlet JavaBean JDBC MySQL技术方案的阶段项目。其中有一个需求是根据多条件动态搜索商品信息&#xff0c;最终分页显示出商品列表。这个功能可以在dao层采用多分支条件组合&#xff0c;显示页面使用JST…

2022王道OS 1.3 操作系统运行环境

2022王道OS 1.3 操作系统运行环境 文章目录2022王道OS 1.3 操作系统运行环境1.3_1 操作系统的运行机制知识总览知识点预备知识&#xff1a;程序是如何运行的&#xff1f;两种程序&#xff1a;内核程序 VS 应用程序两种指令&#xff1a;特权指令 VS 非特权指令两种状态&#xff…

二、【React脚手架】组件化编码(TodoList案例)

文章目录1、组件化编码流程&#xff08;通用&#xff09;2、样式覆盖问题3、DEMO3.1、需要实现的效果3.2、前期须知3.3、项目结构3.4、CODE3.4.1、App.js3.4.2、App.css3.4.3、Header3.4.4、List3.4.5、Item3.4.6、Footer1、组件化编码流程&#xff08;通用&#xff09; 拆分组…

Python 面向对象简介

什么是面向对象&#xff1f; 面向对象是一种编程思想&#xff0c;在开发过程中关注的不是解决问题的步骤和过程&#xff0c;而是参与解决问题的对象和它们具备的行为。 01 面向过程和面向对象的区别 1、面向过程 面向过程在开发过程中关注的是解决问题的步骤和过程&#xf…

《计算机体系结构量化研究方法第六版》1.6 成本趋势

1.6.1 时间、产量和大众化的影响 即便没有技术进步&#xff0c;计算机组件的制造成本也会随着时间的推移而降低。这背后有着学习曲线的因素。 【学习曲线&#xff08;from百度&#xff09;】 学习曲线的定义为"在一定时间内获得的技能或知识的速率"&#xff0c;又称…

2022王道OS 1.4 操作系统的体系结构 chap1回顾

2022王道OS 1.4 操作系统的体系结构 & chap1回顾 操作系统的体系结构 知识总览 操作系统的内核 时钟管理&#xff1a;利用时钟中断实现计时功能 原语&#xff1a;一种特殊的程序&#xff0c;具有原子性&#xff08;一气呵成&#xff0c;不可被中断&#xff09; 内核是操…

人工智能开启甲骨文整理研究新范式

编者按&#xff1a;在甲骨学研究中&#xff0c;甲骨“校重”整理是一项费事费力但又极其重要的基础性研究工作。微软亚洲研究院与首都师范大学甲骨文研究中心莫伯峰教授团队合作开发的甲骨文校重助手Diviner&#xff0c;第一次将自监督AI模型引入到甲骨文“校重”工作中&#x…

【Mysql】数据库的基本操作和表的基本操作

本章内容是,用sql语言实现对数据库的基本操作和表的基本操作 文章目录前言1. 数据库的基本操作1.1 创建数据库1.2 查看数据库1.3 选中数据库1.4 删除数据库2. 数据库基本数据类型3. 表的基本操作3.1 创建表3.2 显示数据库中的表3.3 查看表的构造3.4 删表4. 表的增删改查4.1 增加…

使用synchronized 加锁你加对了么?

本文讲解使用synchronized只是对synchronized的使用,底层原理将在后续文章 目录 从实际中理解共享带来的问题 Java代码实现共享带来的问题进行分析 临界区(Critical Section) 与 竞态条件(Race Condition) 临界区 竞态条件 synchronized解决方案 怎么理解synchronized中…

【web前端期末大作业】基于HTML+CSS+JavaScript实现代理商销售管理系统后台(8页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

mathtype在word内的简单使用

一、简单使用 1、快捷键 快捷键说明ctrlaltQ行内公式altshiftQ右编号&#xff08;行间公式&#xff09;\ ;{空格、大括号都需要转义ALTF4关闭mathtype窗口 2、小技巧 \left与\right 一定要配对使用&#xff0c;且对于对称的符号&#xff08;如(), {}等&#xff09;来说&…

【Linux】---进程控制(创建、终止、等待、替换)

文章目录进程创建fork()进程退出进程退出场景进程退出方法退出码exit、_exit进程等待进程等待的方法waitwaitpid阻塞和非阻塞进程替换替换的原理替换所用到的函数execlexeclpexecle简易的shell进程创建 fork() fork函数在之前的文章中也已经提到过了。其主要作用是从已存在的…

excel提示stdole32.tlb的解决方法

大家在使用excel时有遇到stdole32.tlb错误提示吗&#xff1f;出现这个问题直接导致excel无法启动&#xff0c;非常影响用户的工作效率。为了顺利解决问题&#xff0c;小编给大家带来了详细的解决办法&#xff0c;希望可以帮到你。 win7系统打开excel提示stdole32.tlb的解决方法…

Nosql inject注入

0x00 Nosql inject 最近主要在看那个 YApi 的注入漏洞&#xff0c;也是一个 mongodb的注入 所以来写一下这个东西&#xff0c;其实现在越来越常见的Nosql注入 感觉很多分布式和一些新的系统已经大量使用这种nosql数据库&#xff0c;这个注入和传统的关系型数据库有一点点不同…

【Hack The Box】linux练习-- Meta

HTB 学习笔记 【Hack The Box】linux练习-- Meta &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1f36d…

[附源码]计算机毕业设计springboot“科教兴国”支教门户网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

复旦MBA项目GNW海外课程|连线全球顶尖商学院,跨时空学习精彩无限!

10月下旬&#xff0c;复旦MBA为期一周的GNW海外课程落下帷幕&#xff0c;复旦在职MBA的同学们通过云端连线&#xff0c;走进全球多所顶级商学院&#xff0c;与深谙商道、学术造诣深厚的教授学者&#xff0c;以及来自不同地域不同文化背景的精英学生取经论道。      复旦MBA…