美文网首页
回炉学习-C语言:实现swap函数

回炉学习-C语言:实现swap函数

作者: 过气的程序员DZ | 来源:发表于2020-04-20 14:30 被阅读0次

起因

种种原因,今天手写了一个整数交换的函数void swap(int *, int *),本以为很简单,结果引发了很多思考。先上代码,注意,这个代码是错误的,错误的,错误的...

void swap1(int *a, int *b) {
    int *temp = a;
    a = b;
    b = temp;
}

然后是main

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, Test C!\n");
    int a = 10;
    int b = 2;
    swap1(&a, &b);
    printf("a = %d, b = %d\n", a, b);

    return 0;
}

运行


image.png

看到运行结构后,第一反映应该是swap函数写的不对。然后就去看swap函数实现。

错误点

正确代码

void swap2 (int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

对比代码后,意识到,其实自己对指针还是学习的不够深。

原因

现在我们队代码加上一些注释,先看看错误代码的运行结果:

void swap1(int *a, int *b) {
    printf("begin a = %p, b = %p\n", a, b);
    int *temp = a;
    a = b;
    b = temp;
    printf("end a = %p, b = %p\n", a, b);
}

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, Test C!\n");
    
    int a = 10;
    int b = 2;
    printf("&a = %p, &b = %p\n", &a, &b);
    swap1(&a, &b);
    printf("&a = %p, &b = %p\n", &a, &b);
    printf("a = %d, b = %d\n", a, b);
    
    return 0;
}
image.png

问题点在于,我交换的是形参的指针,而不有交换指针指向的值。
我们来看看正确代码的打印结果

void swap2 (int *a, int *b) {
    printf("begin a = %p, b = %p\n", a, b);
    int temp = *a;
    *a = *b;
    *b = temp;
    printf("end a = %p, b = %p\n", a, b);
}

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, Test C!\n");
    
    int a = 10;
    int b = 2;
    printf("&a = %p, &b = %p\n", &a, &b);
    swap2(&a, &b);
    printf("&a = %p, &b = %p\n", &a, &b);
    printf("a = %d, b = %d\n", a, b);
    
    return 0;
}
image.png

形参指针没有交换,交换的是指针指向的值。
看来自己对指针还是理解的不够深啊。

参考文献

温故而知新:C语言中swap函数

相关文章

  • 回炉学习-C语言:实现swap函数

    起因 种种原因,今天手写了一个整数交换的函数void swap(int *, int *),本以为很简单,结果引发...

  • C++ 常用编程--Swap函数有几种写法?

    C++ 常用编程--Swap函数有几种写法? 在说C++模板的方法前,我们先想想C语言里面是怎么做交换的。 举个例...

  • 程序调用过程和堆栈的关系,为什么要传地址而不传值

    bug.c 使用gdb调试,main函数反汇编的代码 swap函数的反汇编代码 在执行到call swap函数之前...

  • 今日python学习

    今天主要学习了两个函数:swap(替换函数),changeA(修改函数) 1:swap函数: 2:changeA函...

  • 【C语言笔记】<五>函数

    C语言程序是有函数组成的.函数是C语言的基本模块,通过对函数模块的的调用来实现特定的功能 什么是函数 函数就是一段...

  • 百度笔试150题

    1、用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 2、用C语言实现函数void ...

  • C语言函数指针和指针函数

    C语言函数指针和指针函数 在学习C语言的过程中,“指针函数”和“函数指针”经常容易搞混了, 最简单的辨别方式就是看...

  • java native

    native说明当前函数不是用java实现,而是通过其他语言(如C/C++)实现,用JNI(Java Native...

  • 各种排序算法实现

    C++实现各种排序算法。上张图。 自定义的swap函数。 冒泡排序 插入排序 希尔排序 选择排序 快速排序 归并排...

  • 保存图片一直闪退

    保存图片,因为我用了C语言函数实现。结果在PHAuthorizationStatusNotDetermined默认...

网友评论

      本文标题:回炉学习-C语言:实现swap函数

      本文链接:https://www.haomeiwen.com/subject/yezrihtx.html