------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

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

  • 交换两个整数
  • 交换两个整形指针
  • 交换任意两个同类型的变量
 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
void swap_int(int* pa, int* qa) //交换两个整数
{
int temp = *pa;
*pa = *qa;
*qa = temp;
} void swap_intpur(int** ppa,int** qqa) //交换两个整形指针
{
int* temp = *ppa;
*ppa = *qqa;
*qqa = temp;
} void swap_any(void* a, void* b, size_t len) //交换任意两个同类型的变量
{
void* temp = malloc(len);
memcpy(temp, a, len); //内存拷贝函数
memcpy(a, b, len);
memcpy(b, temp, len);
} int main()
{
int a = , b = ;
int* p = &a , * q = &b;
printf("Origin a=%d, b=%d\n",a,b);
swap_int(&a,&b);
printf("After swap_int, a=%d, b=%d\n",a,b);
swap_intpur(&p,&q);
printf("After swap_intpur, *p=%d, *q=%d\n",*p,*q);
swap_any((void*)&a,(void*)&b,sizeof(a)); //将a和b的内存地址指针强行转换为未确定类型的指针传入函数中
printf("After swap_any, a=%d, b=%d\n",a,b);
return ; }
输出结果为
Origin a=, b=
After swap_int, a=, b=
After swap_intpur, *p=, *q=
After swap_any, a=, b=
  • 实现交换两个整数

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

  • 实现交换两个整形指针

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

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

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

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

总结

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

黑马程序员——利用swap函数研究C的指针的更多相关文章

  1. 函数sql黑马程序员——SQL常用函数

    最近使用开辟的过程中出现了一个小问题,顺便记录一下原因和方法--函数sql ---------------------- ASP.Net+Android+IO开辟S..Net培训.等待与您交流! -- ...

  2. 黑马程序员-scanf函数

    变量的内存:字节和地址:1.变量的存储单位是字节,每个字节都有存储地址.2.不同的数据大小占用的内存带下不同拥有的字节数也是不同的.变量的存储:1.存储是按照,先存储的放在地址教高的位置,优先存储的地 ...

  3. 黑马程序员-nil Nil NULL NSNull 野指针和空指针

    空指针1.空指针指不含有任何内存地址的指针.在没有具体初始化之前,其被符值为0Dog * dog = nil;Dog * dog = NULL;都为空指针2.野指针指指向的内存为垃圾内存,导致其值不确 ...

  4. 黑马程序员—C语言的函数、数组、字符串

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.函数 定义:函数是代码复用的一种机制. 函数的基本语法: 返回类型 函数名 ( 参数类型 参 ...

  5. 黑马程序员+SQL基础(上)

    黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...

  6. 黑马程序员:Java基础总结----泛型(高级)

    黑马程序员:Java基础总结 泛型(高级)   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...

  7. 黑马程序员:轻松精通Java学习路线连载1-基础篇!

    编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...

  8. 黑马程序员:3分钟带你读懂C/C++学习路线

    随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...

  9. 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具

        Java学习路线图引言:        黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...

随机推荐

  1. C标签

    关键字:JSTL标签.<c:choose>.<c:forEach>.<c:forTokens>.<c:if>.<c:import>.< ...

  2. JSNI GWT中的东东

    二.JavaScript Native InterfaceJavaScript本地接口JSNI.1)声明一个本地方法在JSNI中声明一个本地方法时,使用Java的标准native关键字,就像在JNI( ...

  3. GWT(Google Web Tookit) Eclipse Plugin的zip下载地址(同时提供GWT Designer下载地址)

    按照Eclipse Help->Install new software->....(这里是官方安装文档:http://code.google.com/intl/zh-CN/eclipse ...

  4. 实用技巧:简单而有用的nohup命令介绍(转)

    简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程(本站 ...

  5. 再回首,Java温故知新(一):Java概述

    Java发展历程 Java的发展要追溯到1991年,Patrick Naughton(帕特里克·诺顿)和James Gosling(詹姆斯·高斯林)带领Sun公司的工程师打算为有线电视转换盒之类的消费 ...

  6. myeclipse配置svn亲测

    1.安装目录更改为myeclipse install 目录:E:\MyEclipse85\MyEclipse 8.5common 目录:           E:\MyEclipse85\Common ...

  7. 在进行页面的DIV CSS排版时,遇到IE6(当然有时Firefox下也会偶遇)浏览器中的图片元素img下出现多余空白的问题绝对是常见的对于该问题的解决方法也是“见机行事”。

    当一个img标签没得图片时,在firox中,即使给img标签设置了固定高度和宽度,img标签还是不会站位: 解决方法一:直接将img设置为块状元素:即,设置img为“display:block;”.在 ...

  8. 如何自定义UIPickerView中文本的大小和文本靠左或靠右显示?

    需要重写UIPickerView中的 -(UIView*)pickerView:(UIPickerView*)pickerView viewForRow:(NSInteger)row forCompo ...

  9. linux reboot命令

    命令简介: 该命令用来重启Linux系统.相当于Windows系统中的restart命令. 命令语法: /sbin/reboot [-n] [-w] [-d] [-f] [-i] 或 reboot [ ...

  10. enter 默认搜索

    onkeydown=" if(event.keyCode==13) Search(); "