c题目17拓展:深刻理解2个swap函数的意义

每日小语

灵魂是一种烦人的东西,当人发展完善了灵魂之后,他也就失去了伊甸乐园。——毛姆

 自己思考

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,这就产生了四维空间的那种感觉,它无所不在,既在内,也在外。

唉,我的模型有问题,对指针理解的还是不够清晰。

好啦,让我们现在深入理解一下指针吧!别让未来的自己痛苦,你是最善良的人啊。

可以使用以下通俗的模型来理解指针:

假设你住在一个大楼里,每个房间都有一个门牌号标识。在这个模型中:

  1. 变量:可以将变量看作是一个房间,该房间存储特定的值。例如,一个整数变量就是一个房间,里面存储一个整数值。

  2. 内存地址:可以将内存地址看作是房间的门牌号,用于唯一标识每个房间的位置。每个变量都有一个对应的内存地址。

  3. 指针:可以将指针看作是一个地址记录器,它指向指定房间的门牌号。指针本身也有一个地址和值,这个值就是指向的房间的门牌号。

  4. 解引用:可以将解引用看作是通过门牌号找到对应房间内的具体值。

 

  1. 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 函数中,使用临时变量主要是为了安全地完成两个变量的值交换。

如果直接修改一个变量的值,那么我们将失去对其原始值的访问,这会导致错误的结果。

使用临时变量可以避免这个问题。通过将一个变量的值存储在临时变量中,我们可以安全地在两个变量之间交换值。具体步骤如下:

  1. 将第一个变量的值存储在临时变量中。
  2. 将第二个变量的值复制给第一个变量。
  3. 将临时变量中存储的值赋给第二个变量。

这样,就完成了两个变量值的交换,而不会丢失任何值。

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的值。

差不多就是这样,撒花花~

 

你可能感兴趣的:(c作业,c语言)