传参的指针,你的值到底变了没?!(有关函数形参修改的另类案例)

我们都知道,想要在函数中修改某个变量的值,传变量本身是没有用的。原因在于不同的函数在不同的空间上,函数的生命周期随着函数的调用而结束,因此在函数内部进行的值操作是不会对函数外的变量产生影响的。所以在函数里面想要修改变量的值,必须使用指针。

可是当阴险的助教跟你玩阴的的时候,指针似乎也不好使了....来看看可爱的助教们是怎样坑害清澈愚蠢的大学生的吧~

给出下述程序的执行结果

#include <stdio.h>

void swap(int *p, int *q){

  int *t;

   t=p;

   p=q;

    q=t;

}

int main(){

int a=10,b=20;

swap(&a,&b);

printf("a=%d,b=%d\n",a,b);

return 0;

}

乍眼一看,哼哼,小小的swap函数不就是交换两个变量的值吗,这有何难!

自信写下:a=20,b=10 

然后.... 

听取完一片WA声之后,得看看问题出在了那里。

 上面这个是还没有进行swap的地址

这个是已经交换过后的地址,你会发现没有变。

其实问题的本质是简单的,当你在函数中进行交换的时候,你只是在函数内部对函数的p和q变量进行了交换地址,而&a,&b本质上不是变量(即没有用一个新的变量名来对他们进行存储)而是一个值,所以无论怎样交换,只要你从函数中出来,a和b这两个变量还在,当你写&a,&b的时候,可以理解为又一次的对a和b进行取地址操作,他们俩的地址就不会改变,输出的值也不会改变。

那么假设我们使用两个变量来存储地址呢?

还是没有变(a仍然等于10)!这说明前面的理解是肤浅的,哪怕我们使用了两个变量来存储地址,还是会出现问题。

经过了解之后,上面问题的原理,本质上就是一个:函数传的形参无论它是什么类型,在函数中进行的操作,在主函数或者其他函数中都是无效的(即相应的修改不会对主函数中的这个变量产生影响)。之前我们说想要在函数中修改一个变量的值要传指针,其实是一条普适性的原理。大家可以想一想,指针其实本质上也是一种变量,那么想要修改指针的话就要传入指针的指针——二级指针! 因此本例中在函数中的交换指针的值其实是无效的,a的地址还是a的地址。所有问题就迎刃而解了。

总结来说就是我上面说的那句话:想要在函数中修改一个变量(普通变量,包括指针,二级指针!)的值要传指针!所有函数传参修改值的问题就秉持这个原则就行了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网关未配置导致不同网段ping不通的小问题

问题背景&#xff1a; 搞来两台服务器&#xff0c;想用这两台装vmware来分配多个虚拟机来做开发测试 每台有两个网口&#xff0c;现在只需要一个网口就可以&#xff0c;之后想配置&#xff0c;再从vmware页面上配置&#xff0c;机房环境不是很好&#xff0c;在地下室&#xf…

C语言使用STM32开发板手搓高端家居洗衣机

目录 概要 成品效果 背景概述 1.开发环境 2.主要传感器。 技术细节 1. 用户如何知道选择了何种功能 2.启动后如何进行洗衣 3.如何将洗衣机状态上传至服务器并通过APP查看 4.洗衣过程、可燃气检测、OLED屏显示、服务器通信如何并发进行 小结 概要 本文章主要是讲解如…

C语言-写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

0xaaaaaaaa...等是什么&#xff1f;-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/137179252 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #define SWAP(num) (((num & 0xAAAAAAAA) >> 1) | ((num & 0x55555555) << …

【C++】C到C++的入门知识

目录 1、C关键字 2、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 2.2.1 加命名空间名称及作用域限定符 2.2.2 使用using将命名空间中某个成员引入 2.2.3 使用using namespace 命名空间名称引入 3、C输入&输出 4、缺省参数 4.1 缺省参数的概念 4.2 缺省参数的…

深入理解zookeeper

如果是zookeeper的初学者&#xff0c;可以看&#xff1a; zookeeper快速入门&#xff08;合集&#xff09;-CSDN博客 如果想要深入理解zookeeper&#xff0c;并在面试中取得更好的表现&#xff0c;可以看下面的文章&#xff0c;都是偏面试向的角度写的。 三分钟明白zookeeper…

名字真的会影响我们的职业吗?

名字是我们身份的一部分&#xff0c;人们往往喜欢将一个人名字同一种具体的职业联系在一起&#xff0c;而如果这个人名字看上去更适合一项工作&#xff0c;那么他&#xff08;她&#xff09;就有更多的机会得到这份工作。因此&#xff0c;我们在给福主取名改名时也会与职业特点…

10.Python异常处理

为增强程序的健壮性&#xff0c;我们也需要考虑异常处理方面的内容。例如 &#xff0c;在读取文件时需要考虑文件不存在、文件格式不正确等异常情况。这 就是本章要介绍的异常处理。 1 第一个异常——除零异常 在数学中&#xff0c;任何整数都不能除以0&#xff0c;如果在计算…

PCL 计算点与圆的距离(3D)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 3D中的圆可以有圆心、半径以及法线来进行表示,如下图所示: 这里我们假设: Δ = P − C \Delta=P-C Δ

Wasm初上手

总之也是为了扩宽技术面吧。。。我也不知道为什么就想试试了&#xff0c;就酱。 参考阅读&#xff1a;极客时间《WebAssembly入门课》 安装wasm的编译器Emscripten。Emscripten 是一个“源到源”语言编译器工具集&#xff0c;这个工具集可以将 C/C 代码编译成对应 JavaScript 代…

【PostgreSQL】- 1.4 PostgreSQL 业务规划(创建 Schema)

业务规划与创建 Schemas 如果实际场景&#xff0c;有业务A、业务B、业务C&#xff0c;推荐的方式是在同一个数据库中为每个业务创建不同的 schema。然后&#xff0c;你可以为每个业务创建不同的账户&#xff0c;并赋予这些账户对应业务的 schema 权限。这种方式的好处是&#…

CSS使用clip-path实现元素动画

前言&#xff1a; 在日常开发当中&#xff0c;如果想要开发多边形&#xff0c;一般都需要多个盒子或者伪元素的帮助&#xff0c;有没有一直办法能只使用一个盒子实现呢&#xff1f; 有的&#xff1a;css裁剪 目录 前言&#xff1a; clip-path到底是什么&#xff1f; clip-pa…

【御控物联】 JavaScript JSON结构转换(4):对象To对象——规则属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

赋值语句还能当判断条件?涨芝士了!

赋值和条件看似是C语言中毫不相关的两个概念&#xff0c;虽然实际过程中我猜测不会有太多这种不太符合常理的情况出现&#xff0c;但是现在在学习的过程中&#xff0c;为了出题而出题总是会整出一些花活出来.....这很难不让人联想起高中时一些大佬为了彰显自己的数学天赋而自己…

C++类基础7——移动构造函数,移动赋值运算符

右值引用只不过是一种新的C语法&#xff0c;真正理解起来有难度的是基于右值引用引申出的2种C编程技巧&#xff0c;分别为移动语义和完美转发。 左值、右值、将亡值&#xff1a; 概念&#xff1a; 从以下几个概念逐步深入&#xff1a; 表达式&#xff1a; 要说清“三值”&…

树莓派串口读取陀螺仪ky9250(mpu9250)数据

9轴姿态角度传感器&#xff0c;其中ky9250陀螺仪由于自带卡尔曼动态滤波算法方便用户使用。ky9250陀螺仪基本可以在各个平台上进行数据的读取&#xff08;如stm32\arduino\C#\Matlab\树莓\Unity3d\python\ROS\英飞凌\Nvidia jetson linux 等&#xff09; 1、树莓派和ky9250的接…

[报错解决]Type com.baomidou.mybatisplus.extension.ddl.IDdl not present

springboot整合mybatis-plus关键报错信息 在处理mybatis-plus时遇到的问题&#xff0c;现提供解决方案供参考&#xff1a; org.springframework.beans.factory.BeanCreationException: Error creating bean with name com.baomidou.mybatisplus.autoconfigure.MybatisPlusAu…

C++_第五周做题总结_类与对象

id:27 A.对象数组&#xff08;类和对象&#xff09; 题目描述 课堂上我们谈到类这个概念&#xff0c;比如第一题我们有学生类这个抽象的概念&#xff0c;成千上万个学生都具有同样的属性&#xff0c;但针对某个具体学生来说&#xff0c;他/她具有自己的鲜明个性&#xff0c;比…

AcWing刷题-区间合并

校门外的树 区间合并&#xff1a; from typing import List def merge(intervals: List[List[int]]) -> List[List[int]]:# 按照第一个元素从小到大进行排序intervals.sort(keylambda x: x[0])# 初始化一个新的数组new_list list()for i in intervals:# 把第一个数组元素添…

基于ssm旅游资源网站(java项目+文档+源码)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的旅游资源网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 旅游资源网站的主要使用者分为管理…

描述C语言中的进程和线程之间的区别

描述C语言中的进程和线程之间的区别 在C语言中&#xff0c;进程和线程是两个非常重要的概念&#xff0c;它们在操作系统中各自扮演着独特的角色。理解它们之间的区别对于编写高效、可维护的并发程序至关重要。下面将详细阐述进程和线程在C语言中的区别。 首先&#xff0c;我们…