灵魂是一种烦人的东西,当人发展完善了灵魂之后,他也就失去了伊甸乐园。——毛姆
swap,这个东西上课的时候老师将有两种,一种看起来可以达到目的,但最后并没有swap,另一个swap却运行了,我很好奇,然后我想是指针,我把它想象成了一个盒子,可按照这个模型,我发现无法在最后一步完全一样,它变成了一个类似四维空间的东西,最初的存储的东西,却变成了最后的盒子,就很诡异,趁着这个时间,我打算认真思考一下为什么会这样,老师说它很精妙,我想细细体味一下精妙在哪里。
还有一点,我前段时间深深地意识到做每一件热爱的事,都应该竭尽全力做到尽善尽美,我很抱歉之前的文章排版问题较为严重,但我会认真对待日后每一篇文章,让它产生一种美,只来自我灵魂的美,倘使有一天我懈怠了,那可能是我还不够热爱,我想慢慢寻找热爱。
swap函数对比
在C语言中,`*` 是一个多功能的符号,具有不同的用法,取决于上下文。
以下是`*`在C语言中的几种常见用法:
1. 乘法运算符:用于执行两个数值相乘的操作。例如,`a * b` 表示将 a 乘以 b 的结果。
2. 指针运算符:用于定义和操作指针变量。例如,`int* ptr` 定义了一个指向整数的指针变量 `ptr`。
3. 解引用运算符:用于访问指针指向的内存地址处的值。例如,`*ptr` 表示指针 `ptr` 所指向的值。
我们先深入理解一下第2个概念,前面有类型,*变量代表一个指针变量,无类型时*变量代表该指针变量指向的值。
再细细思考一下,定义时我们要使用*来定义一个指针函数,而这个函数里是什么值都没有的,这个函数只是一个类似空盒子的东西,而后面我们将一些变量存储进入空盒子时,*用于调用这个盒子里装的东西。上课的时候我是这么想的。
swap(int*p1,int*p2) swap(int*p1,int*p2)
{ {
int*p; int p;
p=p1; p=*p1;
p1=p2; *p1=*p2;
p2=p; *p2=p;
} }
现在我们来看一下这两个函数,第一个首先定义了一个指针变量p,然后在里面装入p1,然后呢p1也是一个指针变量,相当于p1里面也是空的,然后又装入了p2这个空盒子,最后我不解的事情发生了,p2=p,,,,,,,
第二个先是直接定义了一个实实在在的变量,也就是东西,然后把p给到了p1这个空盒子里,p1又把自己给了p2,这个时候p2这个大盒子里又给到了p,这就产生了四维空间的那种感觉,它无所不在,既在内,也在外。
唉,我的模型有问题,对指针理解的还是不够清晰。
好啦,让我们现在深入理解一下指针吧!别让未来的自己痛苦,你是最善良的人啊。
可以使用以下通俗的模型来理解指针:
假设你住在一个大楼里,每个房间都有一个门牌号标识。在这个模型中:
变量:可以将变量看作是一个房间,该房间存储特定的值。例如,一个整数变量就是一个房间,里面存储一个整数值。
内存地址:可以将内存地址看作是房间的门牌号,用于唯一标识每个房间的位置。每个变量都有一个对应的内存地址。
指针:可以将指针看作是一个地址记录器,它指向指定房间的门牌号。指针本身也有一个地址和值,这个值就是指向的房间的门牌号。
解引用:可以将解引用看作是通过门牌号找到对应房间内的具体值。
swap(int*p1,int*p2) swap(int*p1,int*p2)
{ {
int*p; int p;
p=p1; p=*p1;
p1=p2; *p1=*p2;
p2=p; *p2=p;
} }
那么我们再次理解一下,第二个函数的话,p是一个变量,是一个房间,就我自己还是不理解,呜呜呜呜呜呜。还是只能gpt
#include
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int num1, num2;
printf("输入两个整数:");
scanf("%d %d", &num1, &num2);
printf("交换前的值:num1 = %d, num2 = %d\n", num1, num2);
swap(&num1, &num2);
printf("交换后的值:num1 = %d, num2 = %d\n", num1, num2);
return 0;
}
函数内部,使用临时变量 temp
存储 a
指针指向的值,然后将 a
指针指向 b
指针指向的值,最后将 b
指针指向 temp
的值。这样就完成了两个整数值的交换。
为什么要有临时变量?
在 swap 函数中,使用临时变量主要是为了安全地完成两个变量的值交换。
如果直接修改一个变量的值,那么我们将失去对其原始值的访问,这会导致错误的结果。
使用临时变量可以避免这个问题。通过将一个变量的值存储在临时变量中,我们可以安全地在两个变量之间交换值。具体步骤如下:
这样,就完成了两个变量值的交换,而不会丢失任何值。
swap(int*p1,int*p2) swap(int*p1,int*p2)
{ {
int*p; int p;
p=p1; p=*p1;
p1=p2; *p1=*p2;
p2=p; *p2=p;
} }
我们来运行一下 ,运行后第一个是有问题的,我们具体来拆解一下,首先它搞了一个指针变量,指定房间的门牌号,然后,并没有改变里面的值。
就是想象一个指针,首先需要一个临时变量存储a的值,因为一会要把a的指针指向b的值,a的原始值会丢失,指完后,将b的值指向临时变量,就可以获得a的值。
差不多就是这样,撒花花~