引用传参与指针传参的区别

Reference: https://blog.csdn.net/u013130743/article/details/80806179

概念:

引用传参:引用是变量的别名。引用传参传递进形参列表的是实参的别名,在函数的执行中也会在栈空间上开辟存储空间,存储形参的地址

(也就是实参的地址)。对形参的任何操作都会间接寻址到实参。也就是在函数中对形参变量做的任何改变都会影响到实参变量。

指针传参:指针传参本质上是值传参。指针在形参列表中传递的是实参的地址。也就是说,指针的值的实参的地址。在函数的执行中在栈空间中存储的是实参的地址。但是如果在被调函数中改变指针的地址,则应用不到实参变量。如果使用对指针的解析(*p),就能访问到实参变量。

相同点:

都是地址的概念。

不同点:

1. 引用是变量的别名,有依赖。指针是一个实体,不具有依赖;

2. 引用是需要初始化的,且不能改变;指针可以改变地址指向。

3. 引用是类型安全的,引用过程会进行类型检查;指针不会进行安全检查。

code:

#include<iostream>
using namespace std;
void example(int& p){
    cout<<&p<<endl;
    cout<<p<<endl;
    p = 1;
}void example2(int* p){  cout<<p<<endl;  cout<<*P<<endl;  cout<<&p<<endl;  *p = 1;}
int main(){
    int a = 0;
    cout<<&a<<endl;
    cout<<a<<endl;
    example(a);
    cout<<a<<endl;   example(&a);  cout<<a<<endl;  
    return 0;
}

图解:

1. 引用传参:

2. 指针传参:

原文地址:https://www.cnblogs.com/mtastrid/p/10349170.html

时间: 2024-10-13 17:33:45

引用传参与指针传参的区别的相关文章

jsp内部传参与重定向传参

1 重定向地址栏会发生改变,因为它会发送两次请求,内部转发,地址栏不会发生改变,因为它只有一个请求2 重定向不能获取上一次请求中的参数,而内部转换可以3 内部转发可以访问WEB-INF下的资源,重定向不能访问WEB—INF下的资源4 重定向可以访问服务器以外的资源,内部转发只能访问当前服务器的资源 request代表内部传参response代表重定向传参 response:服务器->本机 request:本机->服务器 在跳转页面的时候会出现乱码,js中的转码方法request.setChar

不通过传值传指针传引用而实现形参修改实参的值

1.首先了解一下堆栈帧的创建步骤(来自<32位汇编语言程序设计>钱晓捷一书): 1)主程序把传递的参数压入堆栈: 2)调用子程序时,返回地址压入堆栈: 3)子程序中,EBP压入堆栈:设置EBP等于ESP,通过EBP访问参数和局部变量: 4)子程序有局部变量,ESP减去一个数值,在堆栈预留局部变量使用的空间: 5)子程序要保护的寄存器压入堆栈. 如下图: 2.了解了堆栈帧之后,就可以得出以下程序: 1)嵌入汇编实现 #include<iostream> using namespace

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

Mybatis中#{}和${}传参的区别及#和$的区别小结

最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 select * from table where name = '小李',就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果

[编程开发] 由指针传参引发的一点分析

昨天有同学(初学指针)在练习单链表和二叉树的时候,程序老是崩溃,或者得不到正确结果,于是向我求助.问题就出在指针的参数传递上,没传好指针导致内存混乱,其他代码基本全对.这个错误十分可惜.故在此我想做个记录,可能显得十分基础. 如果函数的参数是普通的一级指针,那么就意味着你只能使用指针.改变指针指向或者改变指向的目标变量.不能试图通过这个指针来申请内存. [cpp] view plaincopyprint? void getMemory(int *p) { p = (int *)malloc(si

内存(传值、传址、传引用)

前言: 最近对内存产生了兴趣.全是因为马士兵老师的一句Master key.马上要考二级了.大题构造函数比较多.形参有 int & x  这么写的.也有int *x 这么写的.还有普通 int x这么写的.我的乖乖这都是传的什么? int x 是 传值.int *x  是传址. int & x是传引用.那这三者传参数都有什么区别呢? 下面就用三个例子讲解 声明:下面堆栈的图其实是不正确的.八个基本类型(byte.short.int.long.char.float.double.boolea

malloc与new,C++中的指针与引用,C++struct与class的区别

一.struct与class的区别 1. struct与class的区别不大 在默认情况下,class默认的权限是private(私有的),struct默认的是public(共有的). 2.但是在C++中,struct进行了扩展,现在它已经不仅仅是一个包含不同数据类型的数据结构了,它包括了更多的功能. 二 .malloc与new,delete与free的区别 1.malloc与free是库函数里的函数,调用时要添加头文件,delete与new是C++中的运算符 2.malloc返回值是void*

[编程开发] 由指针传參引发的一点分析

昨天有同学(初学指针)在练习单链表和二叉树的时候,程序老是崩溃,或者得不到正确结果,于是向我求助.问题就出在指针的參数传递上,没传好指针导致内存混乱,其它代码基本全对.这个错误十分可惜.故在此我想做个记录,可能显得十分基础. 假设函数的參数是普通的一级指针,那么就意味着你仅仅能使用指针.改变指针指向或者改变指向的目标变量.不能试图通过这个指针来申请内存. void getMemory(int *p) { p = (int *)malloc(sizeof(int) * 10); } void fu

ES6中generator传参与返回值

先看两个例子, 1, function* f() { for(var i=0; true; i++) { var reset = yield i; if(reset) { i = -1; } } } var g = f(); document.write(g.next().value) // { value: 0, done: false } document.write(g.next().value) // { value: 1, done: false } document.write(g.