zoukankan      html  css  js  c++  java
  • 黑马程序员——利用swap函数研究C的指针

    设计3个函数,分别实现已下功能:

    • 交换两个整数
    • 交换两个整形指针
    • 交换任意两个同类型的变量
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 void swap_int(int* pa, int* qa) //交换两个整数
     5 {
     6     int temp = *pa;
     7     *pa = *qa;
     8     *qa = temp;
     9 }
    10 
    11 
    12 void swap_intpur(int** ppa,int** qqa) //交换两个整形指针
    13 {
    14     int* temp = *ppa;
    15     *ppa = *qqa;
    16     *qqa = temp;
    17 }
    18 
    19 void swap_any(void* a, void* b, size_t len) //交换任意两个同类型的变量
    20 {
    21    void* temp = malloc(len); 
    22    memcpy(temp, a, len); //内存拷贝函数
    23    memcpy(a, b, len);
    24    memcpy(b, temp, len);
    25 }
    26 
    27 int main()
    28 {
    29     int a = 4, b = 3;
    30     int* p = &a , * q = &b;
    31     printf("Origin a=%d, b=%d
    ",a,b);
    32     swap_int(&a,&b);
    33     printf("After swap_int, a=%d, b=%d
    ",a,b);
    34     swap_intpur(&p,&q);
    35     printf("After swap_intpur, *p=%d, *q=%d
    ",*p,*q);
    36     swap_any((void*)&a,(void*)&b,sizeof(a)); //将a和b的内存地址指针强行转换为未确定类型的指针传入函数中
    37     printf("After swap_any, a=%d, b=%d
    ",a,b); 
    38     return 0;
    39 
    40 }
    输出结果为
    Origin a=4, b=3
    After swap_int, a=3, b=4
    After swap_intpur, *p=4, *q=3
    After swap_any, a=4, b=3
    • 实现交换两个整数

    在C语言中,所有函数参数都是“通过值”传递的,也就是说,传递给被调用函数的参数值存放在临时变量中,而不是存放在原来的变量中,所以被调用的函数不能直接修改主调函数中的变量的值。此时我们将主函数中两变量的内存地址传递给被调用函数,虽然这个地址是存放在临时变量里,但我们在调用的函数中将这地址中的内容调换,从而达到交换主函数中两整数变量的值的目的。

    • 实现交换两个整形指针

    同样,我们并不能直接交换连个整形指针,同样是将两个整形指针的地址传入被调用的函数中,交换方式和第一个函数类似。但此时注意的是,我们是将p指针和q指针的地址传入被调用函数,所以在函数swap_intpur的*ppa中存放指针p,所以我们需要用一个指针变量作为缓冲变量,即此时我们用* temp而不是temp。

    • 实现交换任意两个同类项的变量

    不同类型的变量,在内存中的存储长度是不同的,所以我们为应对任意变量,在传递变量的同时也要传递变量的储存长度。因为传递的长度并不确定,所以我们在swap_any中对len的类型申明采用size_t,以确保其大小足以保证存储内存中对象的大小。在调用此函数时也是利用sizeof获取传入变量的长度。

    malloc函数的作用是向系统申请分配指定size个字节的内存空间,利用这一函数我们就可以确定缓冲变量的长度。最后利用memcp函数,其作用是内存拷贝,即从源所指的内存地址的起始位置开始拷贝n个字节到目标所指的内存地址的起始位置中。

    总结

    指针:指向一块内存的起始位置,指针的类型决定了这块内存的大小。

  • 相关阅读:
    路径不对 导致FileNotFoundError: [WinError 2] 系统找不到指定的文件, 问题解决办法
    pycharm + selenium + python 提示 Unresolved reference 'webdriver' 解决办法
    highstock实现股票分时
    jquery 源码剖析1
    html 其它标签
    html5 基本内容 摘自W3C
    html总结
    web性能 部分
    linux常用命令 3
    linux常用命令 2
  • 原文地址:https://www.cnblogs.com/aisleep/p/4827825.html
Copyright © 2011-2022 走看看