黑马程序员——利用swap函数研究C的指针
------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的指针的更多相关文章
- 函数sql黑马程序员——SQL常用函数
最近使用开辟的过程中出现了一个小问题,顺便记录一下原因和方法--函数sql ---------------------- ASP.Net+Android+IO开辟S..Net培训.等待与您交流! -- ...
- 黑马程序员-scanf函数
变量的内存:字节和地址:1.变量的存储单位是字节,每个字节都有存储地址.2.不同的数据大小占用的内存带下不同拥有的字节数也是不同的.变量的存储:1.存储是按照,先存储的放在地址教高的位置,优先存储的地 ...
- 黑马程序员-nil Nil NULL NSNull 野指针和空指针
空指针1.空指针指不含有任何内存地址的指针.在没有具体初始化之前,其被符值为0Dog * dog = nil;Dog * dog = NULL;都为空指针2.野指针指指向的内存为垃圾内存,导致其值不确 ...
- 黑马程序员—C语言的函数、数组、字符串
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.函数 定义:函数是代码复用的一种机制. 函数的基本语法: 返回类型 函数名 ( 参数类型 参 ...
- 黑马程序员+SQL基础(上)
黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...
- 黑马程序员:Java基础总结----泛型(高级)
黑马程序员:Java基础总结 泛型(高级) ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...
- 黑马程序员:轻松精通Java学习路线连载1-基础篇!
编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...
- 黑马程序员:3分钟带你读懂C/C++学习路线
随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...
- 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具
Java学习路线图引言: 黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...
随机推荐
- spark 启动时候报 Unable to load native-hadoop library for your platform 警告
hadoop2.6.4 jdk1.8 spark2.0.1 方案1: 在spark的conf目录下,修改spark-env.sh文件加入LD_LIBRARY_PATH环境变量,值为hadoop的nat ...
- OC封装的TLV数据格式解析库
作者:朱克锋 邮箱:zhukefeng@iboxpay.com 转载请注明出处:http://blog.csdn.net/linux_zkf TLV是一种可变格式,意思就是: Type类型, Leng ...
- winform 加密 解密 分类: WinForm 2014-05-16 15:05 400人阅读 评论(0) 收藏
界面显示: 加密: 解密: 代码实现: public string EncryptString(string str) { #region 加密程序 ...
- 【Android - 进阶】之图片三级缓存的原理及实现
在Android开发中,如果图片过多,而我们又没有对图片进行有效的缓存,就很容易导致OOM(Out Of Memory)错误.因此,图片的缓存是非常重要的,尤其是对图片非常多的应用.现在很多框架都做了 ...
- CSU1306:Manor(优先队列)
Description Bob有n个正整数,他将这n个整数根据大小划分成两部分.对于小于等于k的整数放在集合A中,其余的放在集合B中.每次他从集合B中取出一个最大的值,将其变成0放入A集合中.然后将A ...
- [PWA] Caching with Progressive libraries
Mainly introduce two libaraies: sw-precache and sw-toolbox. Install: npm install --save-dev sw-preca ...
- android 在布局中动态添加控件
第一步 final LayoutInflater inflater = LayoutInflater.from(this); 第二步:获取需要被添加控件的布局 final LinearLayout l ...
- linux文件系统和mount(硬盘,win分区,光驱,U盘)
fdisk –l查看dos/win/ext2分区(partiton,不是slice,slice是solaris分区) [root@localhost etc]# /sbin/fdisk -l Disk ...
- [转] 学习使用:before和:after伪元素
http://www.w3cplus.com/css3/learning-to-use-the-before-and-after-pseudo-elements-in-css.html 如果你一直密切 ...
- 隐藏iframe边框
关于iframe在ie浏览器中边框隐藏的问题,一直困惑着我.其实就是一个很简单的办法,主要设置一个属性即可解决,方法如下: <iframe frameborder="0"&g ...