热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:C与C++关于*与&的传参解析

篇首语:本文由编程笔记#小编为大家整理,主要介绍了C与C++关于*与&的传参解析相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了C与C++关于*与&的传参解析相关的知识,希望对你有一定的参考价值。








作者 | 李肖遥       责编 | 欧阳姝黎


函数参数传递主要有2种传递方式,值传递和引用传递,这个过程是实际参数将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的一个过程。


本文略过参数不是指针的情况,这种情况实际上是复制了一个外部变量的副本进入函数中,函数体内操作的为该副本,不会实际修改函数外的该变量。


为什么?被调函数的形参只有函数被调用的时候才会临时分配单元,一旦调用结束占用的内存便会释放,所以调用的函数中存储该参数的地址跟被调函数中参数的地址不同。往往我们对C与C++关于*与&的使用不是很清楚,C语言没有引用只有指针,引用是在C++里面才存在的操作。




参数为指针的情况(使用*)


这种情况实际上是在函数内部复制了一个指针的副本,如果单纯的修改指针,在跳出函数后,该指针指向不受影响;但如果修改的是指针指向的值,那么外部指针所指向的内容也相应修改了,因为两个指针都是指向同一个内存空间的。


用*运算取地址的内容,C++代码(C语言也一样的)如下:


#include <iostream> 
using namespace std;
 
void function(int* num){
 *num &#61; 100;
}
 
int main()
{
 int number;
 number &#61; 1;
 function(&number);
  
 cout << number << endl;
 return 0;
}
//输出100

形参num是一个指针&#xff0c;传递过来的是一个地址值&#xff0c;通过改变num对应地址的值来实现值的改变&#xff0c;解引用即可访问到这个地址值映射的值。



引用方式传值(使用&)


#include 
using namespace std;
 
void function(int& num){
 //通过引用改变num的值
 num &#61; 100;
}
 
int main()
{
 int number;
 number &#61; 1;
 function(number);
 cout << number << endl;
 system("pause");
 return 0;
}
//输出100

对引用的操作等于是对其指定的对象进行操作&#xff0c;当将实参传递给形参时&#xff0c;形参就指向了实参。



例子


#include 
using namespace std;
//测试如果引用进入函数后进行修改&#xff0c;跳出函数后变量是否修改&#xff1b;
void ChangeRef(int& ref) {
    ref&#43;&#43;;
    cout << "引用内修改后的值为:" << ref << endl;
}
//测试以传值方式进入函数进行修改&#xff0c;跳出函数后变量是否修改
void ChangeNotRef(int ref) {
    ref&#43;&#43;;
    cout << "通过传值方式在函数内修改后的值为:" << ref << endl;
}
//测试以指针为参数传入函数&#xff0c;修改指针指向&#xff0c;是否影响外部指针指向
void ChangePtr(int* ptr) {
    ptr&#43;&#43;;
    cout << "函数内修改后的指针指向&#xff1a;" << ptr << endl;
}
//测试在函数中修改指针指向的内容&#xff0c;是否影响外部指针指向内容
void ChangePtrVal(int* ptr) {
    (*ptr)&#43;&#43;;
    cout << "函数内修改后指针指向的值&#xff1a;" << *ptr << endl;
}
int main() {
    int Ref &#61; 0;
    cout << "传入引用之前的值为:" << Ref << endl;
    ChangeRef(Ref);
    cout << "在函数内修改引用后&#xff0c;跳出函数的值为:" << Ref << endl << endl;
    ChangeNotRef(Ref);
    cout << "通过传值方式在函数内修改后&#xff0c;跳出函数的值为:" << Ref << endl << endl;
    int* ptr &#61; &Ref;
    cout << "传入函数前的指针指向&#xff1a;" << ptr << endl;
    ChangePtr(ptr);
    cout << "传值方式传入函数跳出后的指针指向&#xff1a;" << ptr << endl << endl;
    cout << "传入前指针指向的值为&#xff1a;" << *ptr << endl;
    ChangePtrVal(ptr);
    cout << "从函数中出来后指针指向的值为&#xff1a;" << *ptr << endl << endl;
    system("pause");
    return 0;
}//参考网上例子

运行结果如下&#xff1a;




小结


值传递和引用传递&#xff0c;传递的都是实参的一个拷贝。


C语言中实参和形参之间的数据传递是单向。


被调用函数的形参只有函数被调用时才会临时分配存储单元&#xff0c;结束便会被释放。






☞不同芯片的 Mac 电脑&#xff0c;差距会逐渐拉大吗&#xff1f;☞乐视 logo 换新&#xff1a;显示“老板造车美利坚”&#xff1b;雷军给米粉起名小粽子&#xff1b;谷歌浏览器不再隐藏完整 URL|极客头条
☞“搏一搏&#xff0c;单车变摩托&#xff01;”华为天才少年耗时四个月&#xff0c;将自行车强势升级为自动驾驶




推荐阅读
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
author-avatar
萱萱loveTFOOYS
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有