当前位置:网站首页>从交换两数据值看指针的使用(c语言实现)
从交换两数据值看指针的使用(c语言实现)
2022-08-10 05:36:00 【随便写写。】
一、交换两数据值的错误做法
错误一:
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int x=1;
int y=2;
swap(x,y);
}
错误原因:主函数调用swap函数时,swap函数会分配a,b两个空间来存储主函数的参数,swap函数执行完后
swap中分配的栈空间中a,b两个值交换了。但是当swap函数执行完返回主函数时,a,b两个变量被释放,而主函数中的x,y并么有改变。
错误二:
void swap(int* a, int* b)
{
int* temp = a;
a = b;
b = temp;
}
int main()
{
int x=1;
int y=2;
swap(&x,&y);
}
错误原因:转函数调用swap函数时,swap函数分配两个指针变量a,b来存储x,y的地址,swap函数运行后,交换的是两个指针变量的地址,a指向y,b指向x,在swap函数返回主函数后,a,b两个指针变量被释放,主函数的x,y仍然没有被改变。
二、交换两变量值得正确做法
交换常量值:
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int x=1;
int y=2;
swap(&x,&y);
}
主函数调用swap函数时,swap函数分配两个指针变量a,b分别指向x,y,swap函数通过*p直接访问指针所指向的值,并将他们交换,当swap函数返回主函数后a,b两个指针变量被释放,但是他们指向的x,y被改变了。
交换指针变量值:
void swap(int** c, int** d)
{
int* temp = *c;
*c = *d;
*d = temp;
}
int main()
{
int x = 1;
int y = 2;
int* a = &x;
int* b = &y;
swap(&a, &b);
}
主函数调用swap函数时,swap函数中分配两个指针变量c,d分别指向主函数中的指针变量a,b,执行swap函数时,通过c,d两个指针变量来操作a,b两个指针变量,达到交换两个指针变量的目的。只会改变指针变量a,b中存储的地址,不会改变常量x,y的值。
void swap(int* c, int* d)
{
int temp = *c;
*c = *d;
*d = temp;
}
int main()
{
int x = 1;
int y = 2;
int* a = &x;
int* b = &y;
swap(a, b);
}
主函数调用swap函数时,分配两个指针变量c,d来存储指针变量a,b的值,也就是c,d直接指向变量值,通过*P来交换变量值,所以最后变量x,y会改变,而a,b中存储的地址不会改变。
总结
子函数要对主函数的变量进行操作,子函数中的传入参数要为主函数变量的地址,如主函数为普通变量,则传入参数要为指针,如主函数为指针变量,传入参数要为二级指针,依次内推。然后子函数中通过该指针来改变主函数的变量的值,不要再子函数中直接操作指针,而要通过*p来操作指向的变量。最后一种情况与交换常量值相似,都是改变常量的值,而不会改变主函数指向常量的指针。
边栏推荐
- PyTorch之训练技巧
- Pytorch - 07. Multidimensional characteristics of input processing
- pytorch-08. Load dataset
- Flutter的生命周期
- LeetCode 面试题17.14 最小k个数(中等)
- LeetCode refers to offer 10-I. Fibonacci sequence (simple)
- pytorch-10. Convolutional Neural Networks (homework)
- 三种素数筛总结——(朴素筛,埃氏筛,线性筛)
- STM32F407ZG GPIO输出相关实验
- Radon 变换原理和应用
猜你喜欢
随机推荐
LeetCode 100.相同的树(简单)
51单片机室内环境甲醛PM2.5光照温度湿度检测及窗帘加湿消毒控制系统
ASP.NET有关于文件上传、下载、全选、删除选中重要干货(亲测有效)
通过配置CubeMX的TIMER的PWM初始化实现硬件PWM呼吸灯闪烁
pytorch-08.加载数据集
Tensorflow 2.0 使用流程详解
C陷阱与缺陷 个人阅读笔记
LeetCode 162.寻找峰值(中等)
开源游戏服务器框架NoahGameFrame(NF)简介(一)
菜谱小程序源码免费分享【推荐】
作为测试,常用的adb命令
过大数组导致爆栈的解决方法记录(堆栈)
STM32F407ZG TIM通用定时器
Linux的文件IO与标准IO,以及IO缓存
详解样条曲线(上)(包含贝塞尔曲线)
Multisim软件的基本使用
pytorch-09. Multi-classification problem
探索性数据分析EDA
离散数学的学习记录
Test of the opposite sex what you look like?