A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© acdd112 中级黑马   /  2015-9-22 10:00  /  970 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 acdd112 于 2015-9-22 10:20 编辑

设计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. void swap_intpur(int **ppa,int **qqa)
  11. {
  12.     int *temp = *ppa;
  13.     *ppa = *qqa;
  14.     *qqa = temp;
  15. }

  16. void swap_any(void *a, void *b, size_t len)
  17. {
  18.    void *temp = malloc(len);
  19.    memcpy(temp, a, len);
  20.    memcpy(a, b, len);
  21.    memcpy(b, temp, len);
  22. }

  23. int main()
  24. {
  25.     int a = 4, b = 3;
  26.     int *p = &a , *q = &b;
  27.     printf("Origin a=%d, b=%d\n",a,b);
  28.     swap_int(&a,&b);
  29.     printf("After swap_int, a=%d, b=%d\n",a,b);
  30.     swap_intpur(&p,&q);
  31.     printf("After swap_intpur, *p=%d, *q=%d\n",*p,*q);
  32.     swap_any((void*)&a,(void*)&b,sizeof(a));
  33.     printf("After swap_any, a=%d, b=%d\n",a,b);
  34.     return 0;
  35. }
复制代码



  • 实现交换两个整数
在C语言中,所有函数参数都是“通过值”传递的,也就是说,传递给被调用函数的参数值存放在临时变量中,而不是存放在原来的变量中,所以被调用的函数不能直接修改主调函数中的变量的值。此时我们将主函数中两变量的内存地址传递给被调用函数,虽然这个地址是存放在临时变量里,但我们在调用的函数中将这地址中的内容调换,从而达到交换主函数中两整数变量的值的目的。
  • 实现交换两个整形指针
同样,我们并不能直接交换连个整形指针,同样是将两个整形指针的地址传入被调用的函数中,交换方式和第一个函数类似。但此时注意的是,我们是将p指针和q指针的地址传入被调用函数,所以在函数swap_intpur的*ppa中存放指针p,所以我们需要用一个指针变量作为缓冲变量,即此时我们用* temp而不是temp。
  • 实现交换任意两个同类项的变量
不同类型的变量,在内存中的存储长度是不同的,所以我们为应对任意变量,在传递变量的同时也要传递变量的储存长度。因为传递的长度并不确定,所以我们在swap_any中对len的类型申明采用size_t,以确保其大小足以保证存储内存中对象的大小。在调用此函数时也是利用sizeof获取传入变量的长度。
malloc函数的作用是向系统申请分配指定size个字节的内存空间,利用这一函数我们就可以确定缓冲变量的长度。最后利用memcp函数,其作用是内存拷贝,即从源所指的内存地址的起始位置开始拷贝n个字节到目标所指的内存地址的起始位置中。
总结
指针:指向一块内存的起始位置,指针的类型决定了这块内存的大小。


1 个回复

倒序浏览
本帖最后由 acdd112 于 2015-9-22 10:21 编辑

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
补上输出结果
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马