​​​前言:

我们在初学c语言时都会遇到的一个题目,那就是交换两个数字的大小,我们需要定义两个变量保存两个值,再定义一个temp进行中间值保存

int temp=0;
int a=10;
int b=20;
temp=a;
a=b;
b=temp;

那么在后面我们接触到了指针,我们该如何使用指针进行两个数的交换呢?

一、指针是什么

通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。
指针就是地址。
指针(地址)变量: 类型*变量名  储存的就是指针  指针变量就是一个变量
指针变量:解引用,间接访问符
例如 int *p=&a   就是定义了一个指针变量,p(指针)变量指向a的地址
*p=100 //a=100   *p指向a的值

(1)指针变量的定义

//分别定义了 int、float、char 类型的指针变量
int *x;
float *f;
char *ch;

如上面的定义,指针变量名为 x、f、ch。并不是*x、*f、*ch

(2)指针变量的使用

取地址运算符&:单目运算符&是用来取操作对象的地址。例:&i 为取变量 i 的地址。对于常量表达式、寄存器变量不能取地址(因为它们存储在存储器中,没有地址)。

指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。

(3)指针变量的初始化

 //声明了一个普通变量 aint a=10;//声明一个指针变量pa,指向变量 a 的地址int* pa;//通过取地址符&,获取 a 的地址,赋值给指针变量pa = &a;//*pa指向a的值*pa = a;//通过间接寻址符,获取指针指向的内容printf("%d", *pa);return 0;

(4)指针变量的赋值,运算

int main()
{int a;int b;int c;//定义p1,指向a,通过p1将a值赋值为50int* p1 = &a;*p1 = 50;printf("%d\n", a);//p1指向b,通过p1将b值赋值为100p1 = &b;*p1 = 100;printf("%d\n", b);//p1指向c,通过p1将c值赋值为200p1 = &c;*p1 = 200;printf("%d\n", c);return 0;
}

(5)二级指针的定义初始化

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 这就是二级指针 。

1、*pp通过对pp中的地址进行解引用,这样找到的是 p1 , *pp 其实访问的就是 p1

2、**pp 先通过 *pp 找到 p1 ,然后对 p1 进行解引用操作: *p1 ,那找到的是 a

int main()
{int a = 10;int* p1 = &a;printf("%d\n", &p1);  //p1也是一个变量(指针变量),拥有自己的地址printf("%d\n", &a);printf("%d\n", p1);   //p1指向a的地址printf("%d\n", *p1);int** pp = &p1;        //定义了一个二级指针变量pp指向p1的地址//*pp = p1;     //*pp其实就是p1 ,p1指向&a,所以*pp也指向&a//**pp = *p1;  //**pp其实就等于*p1 ,*p1指向a的值,因此**pp指向a的值printf("%d\n", *pp);printf("%d\n", **pp);return 0;
}

 二、用函数编写两个数交换

实践:

上面我们讲解了指针基本用法,那么我们如何用编写函数,用指针来实现两数交换呢?

实现 Swap 函数,将两个数交换。版本 1(不成功)。
void Swap(int x,int y)//交换不成功{int tmp = x;x = y;y = tmp;}int main(){int a = 10;int b = 20;printf("交换前:%d,%d\n",a,b);Swap(a,b);printf("交换后:%d,%d\n",a,b);return 0;}

如果想在 Swap 函数中修改 main 中 a,b 的值,必须突破不同函数间的限制,而

指针就能达到这个效果,版本 2:
void Swap(int *p1,int *p2){int *tmp = p1;p1 = p2;p2 = tmp;
}int main(){int a = 10;int b = 20;printf("交换前:%d,%d\n",a,b);Swap(&a,&b);printf("交换后:%d,%d\n",a,b);return 0;}

执行结果如下:

你会发现数据没有交换成功,这是为什么呢?

在 Swap 函数中增加解引用操作,版本 3:

 void Swap(int *p1,int *p2){int *tmp; //1*tmp = *p1; //2*p1 = *p2; //3*p2 = *tmp; //4}int main(){int a = 10;int b = 20;printf("交换前:%d,%d\n",a,b);Swap(&a,&b);printf("交换后:%d,%d\n",a,b);return 0;
}

上面代码运行到注释的 2 这句时,程序崩溃,在编译时编译器会提醒你”使 用了未初始化的局部变量”,这是因为使用了野指针。

野指针:也称为悬挂指针,是没有访问权限的地址。这个地址有可能不存在,
也有可能存在但是你不能访问。比如”长安街-5 号”这是一个不存在的地址访
问当然会失败,而”中南海”这个地址是存在的,但是你却不能进入(虽然你想)。
NULL:空指针,表示当前是一个无效的指针,注意和野指针区分。
如果你有过网络购物的经验这两个概念就非常好区分。你在网上买了一本书, 但是收货地址的手机号是空的,没有写,这就是 NULL 指针,卖家很容易辨别这个 错误。如果你把手机号写错了”13888889999”,这个卖家是发现不了这个错误的, 只有等到快递小哥给你打电话时才发现电话号是空号或者接电话的是刘先生
把野指针消除,版本 4:
void Swap(int* p1, int* p2)
{int tmp;tmp = *p1;*p1 = *p2;*p2 = tmp;
}//实现两个数的交换
int main()
{int a;printf("请输入a=");scanf("%d", &a);int b;printf("请输入b=");scanf("%d", &b);Swap(&a, &b);printf("交换后a=%d b=%d\n", a, b);return 0;
}

编译结果:

 如果觉得有帮助麻烦点个赞!!

(指针详解1)例:用函数编写两个数的交换相关推荐

  1. 使用函数实现两个数的交换(C语言)

    题目:使用函数实现两个数的代码 常规思路: 定义函数,调用函数,完成交换. 你的代码是否和下面一样呢? #include<stdio.h> #include<stdlib.h> ...

  2. C语言用fun函数实现两个数的交换

    #include <stdio.h> void fun(int *x,int *y)//定义fun函数,此时需要注意与main函数时的定义方式相同 {     int t;//定义一个中间 ...

  3. C语言结构体中定义函数指针详解

    C语言结构体中定义函数指针详解 结构体指针函数应用场景之一--驱动程序编写 结构体的一些基本用法 形式1:先定义结构体类型,再定义变量 形式2:在定义类型的同时定义变量 形式3:直接定义变量,用无名结 ...

  4. C/C++ 指针详解

    指针详解 参考视频:https://www.bilibili.com/video/BV1bo4y1Z7xf/,感谢Bilibili@fengmuzi2003的搬运翻译及后续勘误,也感谢已故原作者Har ...

  5. c语言的指针详解ppt,最全的C语言指针详解.ppt

    最全的C语言指针详解.ppt 第6章 指针,6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的 ...

  6. C++ 智能指针详解

    智能指针内容很多,重点是基本用法. #include <boost/shared_ptr.hpp> class CBase: public boost::enable_shared_fro ...

  7. C++Study 指针详解

    C++指针详解 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区, ...

  8. c语言getline函数什么意思,详解C++ cin.getline函数

    cin 虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题. 当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格.制表符或换行符).一旦它接 ...

  9. php 数组 指针,php之数组指针详解

    本文主要和大家分享php之数组指针详解,首先我们会和大家分享php 数组指的针操作方法,希望能帮助到大家. 一.php 数组指针操作 利用php的内置函数:key,current,next(),pre ...

最新文章

  1. Redis史上最强【集群】入门实践教程
  2. 数据包构造分析工具Hping3常用命令集合大学霸IT达人
  3. Restorator V2009 单文件版
  4. PIL中分离通道发生“AttributeError: 'NoneType' object has no attribute 'bands'”
  5. 实时多线程系统的日志实现
  6. 大连理工优化方法matlab,大连理工大学2016年秋季优化方法大作业.pdf
  7. 从文本分类问题中的特征词选择算法追踪如何将数学知识,数学理论迁移到实际工程中去...
  8. c++中vecto容器r常使用的相关函数
  9. 2020年的前端该怎么学?不吹不黑
  10. [BZOJ2761/Luogu4305][JLOI2011]不重复数字 题解
  11. 3h精通OpenCV(四)-绘制形状与文本
  12. for循环中取出最大最小 累加_使用 for 循环实现从 1 累加至 10。_学小易找答案...
  13. ISO 7064:1983.MOD11-2校验码计算法(身份证18位效验码计算)
  14. 深度linux 无线网卡,在Deepin Linux系统无线网卡、蓝牙模块驱动安装和出现问题的解决...
  15. HBase开发: Java API 管理表
  16. 计算机主机对人体的辐射,电脑辐射的范围是多少
  17. JeeSite 是什么、概述
  18. log4j2 漏洞的简单利用
  19. 与门的Python实现
  20. Beta冲刺-第三天

热门文章

  1. 常微分方程实验(3.2):解的延拓
  2. java jmf播放声音_java – 使用RTP在JMF中实现播放器
  3. Freeswitch连接SIP电话
  4. 到货服务器设备工作项目,设备到货验收监理工作细则
  5. (小白)python如何微信自动加好友
  6. 彻底弄懂 ASCII 码的所有符号
  7. python练习——多个excel表格模板的读取,并进行简要的统计分析
  8. mos管 rl_MOS各个参数详解
  9. classes是什么意思怎么读_般若怎么读?般若是什么意思?
  10. 201111621401-白乐乐-思维导图