在最近的C语言学习中,老师讲到了指针,原来就听说指针这一块比较难以理解。我把最近的学习心得分享在此。
通常在我们的机器中都会有一系列的连续编号的或编址的存储单元,这些存储单元可以进行单个操作,也可以进行成组的操作。我们都知道,CHAR类型的数据在存储单元中占一个字节,一个SHORT类型的数据占两个字节,一个INT类型的数据占四个字节……。指针就是能够存放一个地址的一组存储单元。指针在定义时的含义是取地址,在使用时的含义是解引用在32位系统中,一个指针类型的数据占四个字节,在64位系统中,一个指针类型的数据占八个字节。
在未学习指针之前,我们写一个交换两个数字a,b的代码,最稳定的做法就是定义一个中间变量t,int a = 1;int b = 2; int t; t=a;a = b;b = t; 这样无疑是最容易理解的。但是,在我们以后长远的学习生活来看,如果我们每次交换都要写一次未免有些过于麻烦,此时我们可以写成函数,在以后需要交换两个数字的值时,便可以直接调用。

 #include <stdio.h>void Swap(int a,int b){
int tmp;
tmp = a;
a = b;
b = tmp;
printf("%d %d\n",a,b);
}int main()
{
int a = 10;
int b = 20;
Swap(a,b);
return 0;
}

相信对于许多初学者来说这样完全没毛病吧,对于前一段时间的我来说,这样真的没毛病。但是在最近的学习过程中我清楚了这几个问题:
1、在子函数中打印是错误的,在运算结果来看,我们的确对了,但是我们在调用函数的时候,实参向形参传递的仅仅是它的值,而不是它的地址。例如在一条街道上,房子样式都一样,我们现在要去找一间房子,怎么找?外观都一样,我们肯定是看门牌号来寻找我们要找的房子,门牌号就是房子的一个唯一性的标识。在代码中也是一样,只有访问地址我们真正交换两个数字的值。

当我们把在主函数进行打印时便会发现其实两个代码只是换了“衣服”,实质并没有改变。

此时我们利用下刚学习的指针来实现两个代码地址的交换,

 void Swap2(int *p1,int *p2)
{
int *tmp = p1;
p1 = p2;
p2 = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap2(&a,&b);
printf("%d %d\n",a,b);return 0;
}

结果仍然没有改变。我们此时把参数类型改成了int* 类型,在主函数调用的时候我们也是取了地址。但是为什么还是错误的呢? 因为我们此时只是定义了指针,并没有在函数中解引用这个指针,指针只有解引用了,才能算是我们访问了数据地址。我们再来改一下代码,

 #include <stdio.h>void Swap(int *p1,int *p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}int main()
{
int a = 10;
int b = 20;
Swap(&a,&b);
printf("%d %d\n",a,b);return 0;
}


这次就是正确的啦。
我们在子函数中,定义的tmp存取的是*p1解引用后的值,p1我们存的是a的地址,我们对其进行解引用,访问a地址,此时a存放的值是10,我们把10赋值给了tmp,同理,我们解引用p2,得到b存放的值然后再赋值给解引用后的p1,此时a地址中并没有存放数据,我们就把20存到了a,然后再用同样的方法把tmp的值存到了b地址中。从而达到了我们真正的数字的交换。

所以我们可以总结一下:子函数的改变想要影响到父函数,必须进行两个操作:一是取指针;二是取完指针后要对指针进行解引用。

指针虽然学习起来有些绕,但是能够把指针给学好,并用在编写代码上,我们的代码能够更加灵活进行一系列操作。

这便是我在数字交换中对指针的理解,若有错误,欢迎大家指出。一个还在爬门槛的小白,也更希望得到大神的指点。

利用指针完成两个数字的交换(c语言)相关推荐

  1. 利用递归求两个数字的最大公约数

    利用递归求两个数字的最大公约数 var _sum=1;var n=1;var _empty=null;function work7(a,b){if(a<b){//判断a是否小于b,如果小于b交换 ...

  2. c语言怎么将两个整数变量值交换,C语言如何利用异或进行两个值的交换详解

    C语言异或运算 位运算符家族中,最常用的,某过于异或运算符. 异或运算符是指: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1.即:0^0=0, 1^0=1, 0^1=1, 1^1=0 例 ...

  3. 两个数字的交换(指针的使用)

    最近刚刚学了号称C语言最难的指针, 初学之际如果未加以正确的解释和引导确实很难理解,其实所谓指针就是一个地址变量,在计算机中,在进行绝大多数操作是都应该先调用地址将所需要的值存放进去以供使用,而所谓指 ...

  4. Python不借助中间值实现两个数之间的交换

    在C.JAVA等语言中,不借助函数或类方法实现两个数的交换需要借助中间变量temp来完成,在Python中简化了定义中间变量这一过程便可直接进行两个变量数值间的交换,接下来将用C与Python分别进行 ...

  5. LeetCode_剑指 Offer 57. 和为s的两个数字(利用set、双撞指针两种思路 Java实现)

    题目描述:剑指 Offer 57. 和为s的两个数字 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,则输出任意一对即可. 示例 1: 输入:n ...

  6. C语言借助两个数的大小交换,引入指针。

    前期没有指针的时候,我们的交换只可以通过在被调函数中输出语句,来输出交换后的样子! 被调函数的形参是局部变量,生命期仅仅在被调函数中有.因此,主函数中a,b仍然是最初的模样! 但是,有指针后交换的就是 ...

  7. ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能

    ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 estimator = PC ...

  8. C语言交换两个数字的三种做法

    C语言交换两个数字的三种做法 1.借助中间变量法: void swap(int *a , int *b) {int temp;temp = *a;*a = *b;*b = temp; } 2.使用加减 ...

  9. kotlin 两个数字相加_Kotlin程序交换两个数字

    kotlin 两个数字相加 Given two numbers, we have to swap them. 给定两个数字,我们必须交换它们. Example: 例: Input: First num ...

最新文章

  1. python axis 1_科学网—Python初学之解读MDFA模块(2):解读 def rwalk(X, axis=-1) - 刘磊的博文...
  2. Safari回传值给应用程序
  3. JQuery的无缝滚动
  4. vue目录结构及简单的开发介绍
  5. oracle 00371,PLS-00371: 'WEB_LOGIN_CHECK_PK.CURSORTYPE' 最多允许有一个声明
  6. Renting Boats
  7. SDUT 2218 Give Me an E(规律)
  8. js基础知识汇总05
  9. java运行环境配置实验报告_java程序开发运行环境实验报告.doc
  10. 没想到还可以用地图这么讲故事?Esri产品布道师为你精细了18个应用案例
  11. Oracle函数之ratio_to_report函数
  12. 小程序云开发学习资料汇总(祈澈菇凉6月学习计划)
  13. 高数 | 导数极限定理、分段点求导能不能用公式?导数和导数的极限?
  14. Redis 启动的三种方法
  15. 二自由度车辆的运动学模型和动力学模型
  16. 疫情只是催化剂 2020注定开启协同办公新纪元
  17. 参加微软学生开发者峰会,了解Azure和GitHub……
  18. 掌握 Ajax -- Ajax 简介
  19. H3C无线配置需要注意的步骤
  20. JAVA 一个月多少天

热门文章

  1. Eclipse Helios(3.6.2)下载地址
  2. 苹果开发者平台-《测试证书》生成流程
  3. 基于Java(SSH 框架)+MySQL 实现的物流配送管理系统【100010488】
  4. MySQL基础教程系列-约束(三)唯一约束
  5. 绿色信贷数据合集(更新至2021年)
  6. 【java】简单练习-打印斜坡
  7. 大热的“滑板底盘”会以什么节奏落地?
  8. 数据结构 (3)栈与队列之粗心的人如何写oj血的教训
  9. NLP自然语言处理中oov的词的解释
  10. 全志H616芯片香橙派Orange Pi Zero2开发板26pinGPIO口测试