(指针详解1)例:用函数编写两个数的交换
前言:
我们在初学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;
}
二、用函数编写两个数交换
实践:
上面我们讲解了指针基本用法,那么我们如何用编写函数,用指针来实现两数交换呢?
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 的值,必须突破不同函数间的限制,而
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 这句时,程序崩溃,在编译时编译器会提醒你”使 用了未初始化的局部变量”,这是因为使用了野指针。
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)例:用函数编写两个数的交换相关推荐
- 使用函数实现两个数的交换(C语言)
题目:使用函数实现两个数的代码 常规思路: 定义函数,调用函数,完成交换. 你的代码是否和下面一样呢? #include<stdio.h> #include<stdlib.h> ...
- C语言用fun函数实现两个数的交换
#include <stdio.h> void fun(int *x,int *y)//定义fun函数,此时需要注意与main函数时的定义方式相同 { int t;//定义一个中间 ...
- C语言结构体中定义函数指针详解
C语言结构体中定义函数指针详解 结构体指针函数应用场景之一--驱动程序编写 结构体的一些基本用法 形式1:先定义结构体类型,再定义变量 形式2:在定义类型的同时定义变量 形式3:直接定义变量,用无名结 ...
- C/C++ 指针详解
指针详解 参考视频:https://www.bilibili.com/video/BV1bo4y1Z7xf/,感谢Bilibili@fengmuzi2003的搬运翻译及后续勘误,也感谢已故原作者Har ...
- c语言的指针详解ppt,最全的C语言指针详解.ppt
最全的C语言指针详解.ppt 第6章 指针,6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的 ...
- C++ 智能指针详解
智能指针内容很多,重点是基本用法. #include <boost/shared_ptr.hpp> class CBase: public boost::enable_shared_fro ...
- C++Study 指针详解
C++指针详解 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区, ...
- c语言getline函数什么意思,详解C++ cin.getline函数
cin 虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题. 当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格.制表符或换行符).一旦它接 ...
- php 数组 指针,php之数组指针详解
本文主要和大家分享php之数组指针详解,首先我们会和大家分享php 数组指的针操作方法,希望能帮助到大家. 一.php 数组指针操作 利用php的内置函数:key,current,next(),pre ...
最新文章
- Redis史上最强【集群】入门实践教程
- 数据包构造分析工具Hping3常用命令集合大学霸IT达人
- Restorator V2009 单文件版
- PIL中分离通道发生“AttributeError: 'NoneType' object has no attribute 'bands'”
- 实时多线程系统的日志实现
- 大连理工优化方法matlab,大连理工大学2016年秋季优化方法大作业.pdf
- 从文本分类问题中的特征词选择算法追踪如何将数学知识,数学理论迁移到实际工程中去...
- c++中vecto容器r常使用的相关函数
- 2020年的前端该怎么学?不吹不黑
- [BZOJ2761/Luogu4305][JLOI2011]不重复数字 题解
- 3h精通OpenCV(四)-绘制形状与文本
- for循环中取出最大最小 累加_使用 for 循环实现从 1 累加至 10。_学小易找答案...
- ISO 7064:1983.MOD11-2校验码计算法(身份证18位效验码计算)
- 深度linux 无线网卡,在Deepin Linux系统无线网卡、蓝牙模块驱动安装和出现问题的解决...
- HBase开发: Java API 管理表
- 计算机主机对人体的辐射,电脑辐射的范围是多少
- JeeSite 是什么、概述
- log4j2 漏洞的简单利用
- 与门的Python实现
- Beta冲刺-第三天