指针为参数的时候,不带引用和带引用的区别

指针为参数的时候,不带引用和带引用的区别

1.问题场景描述

案例1

#include<bits/stdc++.h>
using namespace std;

//指针参数不带引用
void test1(int* a)
{
    a=new int;
    (*a) = 2;
}
//指针参数带引用
void test2(int* &a)
{
    a=new int;
    (*a) = 3;
}

int main(){
    int* a=new int;
    
    (*a)=1;
    cout<<(*a)<<endl;
    test1(a);
    cout<<(*a)<<endl;
    test2(a);
    cout<<(*a)<<endl;
return 0;
}

如上代码块,可能会认为两个函数test1()和函数test2()均会修改外部的指针a存储的值,也就是每次(*a)都会变,也就是预期的输出为如下代码块

//期望的输出
1
2
3

但是实际的输出为:

//实际的输出
1
1
3

这里其实犯了一个错误,将上面场景误认为成了下面这个场景:
案例2:

#include<bits/stdc++.h>
using namespace std;
//指针参数不带引用
void test1(int* a)
{
    *a=2;
}

//指针参数带引用
void test2(int* &a)
{
    *a=3;
}
int main(){
	int* a=new int;
	(*a)=1;
    cout<<(*a)<<endl;
    test1(a);
    cout<<(*a)<<endl;
    test2(a);
    cout<<(*a)<<endl;
return 0;
}

//输出:
1
2
3

不同的原因:案例1修改的是指针变量指向的地址,而案例2修改的是指针变量指向的地址中的值。
具体如图:
请添加图片描述

==下面进行详细说明。==上面图看懂了就不用往下看啦。=w=;‘;’;‘

2.引用符号

&在c++中为引用符号,用于获取变量存储在内存中的地址。

3.指针

这里只做简单介绍。

指针是一种变量,与非指针变量不同的是,非指针变量中,存储的内容是一个值,而指针变量存储的是一个内存地址,具体看一下下面代码块示例。

int main(){
    // 声名指针变量
    int* a = new int;
    *a=1;
    cout<<&a<<endl;
    // 输出:0x6ffe18
    cout<<a<<endl;
    // 输出:0x781520
    cout<<(*a)<<endl;
    // 输出:1
    cout<<&(*a)<<endl;
    // 输出:0x781520
return 0;
}

这里我们就可以引入指针创建的过程了:

int main()
    int* a;// 声名指针变量,这里会为a分配一块内存空间,也就是上面那个代码块中的0x6ffe18

    a=new int;// 分配一块空闲的内存,空闲的内存地址为0x781520。
			  //内存为0x6ffe18位置存储值0x781520。
			  
    *a=1;//内存为0x781520为值存储值1.
return 0;
}

看了上述代码块应该就会清晰许多了,创建并使用一个指针其实分配了两块内存,一块内存用于存储值,一块内存用于存储存储值的地址。

4.函数参数

这里拉回主题,回到指针参数带引用和不带引用的区别原因。

这里我们先看一下如下代码块:

void test(int a)
{
    cout<<&a<<endl;
}

int main(){
    int a;
    cout<<&a<<endl;
    test(a);
return 0;
}


输出为:
0x6ffe1c
0x6ffdf0

我们可以看到,其实在调用函数的时候,c语言是会为参数分配内存的。调用函数的时候,为参数分配内存空间,然后将传过来的变量的值复制到参数分配的内存空间中。这样形成的结果就是,函数外的变量和参数并不使用同一个内存空间,那么修改了参数的值之后,当然也就不会影响到函数外的变量了。

指针作为形参:

void test(int* a){
	a=new int;
}
int main(){
	int* b;
	test(b);
}

调用函数的过程如下:
设函数外的指针变量的内存地址为b,存储的值为地址c

  1. 为参数分配一块内存地址a。
  2. 将地址c存到内存a中。
  3. 在函数中a=new int为改变内存地址a中存储的地址值。
    改变a中存储的地址值后并不会影响到函数外指针变量内存地址b中存储的地址值,所以就造成文章开头案例1在函数内部修改指针,但是并没有修改成功的现象.
    再看一遍这张图帮助理解:
    请添加图片描述
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python 中,函数参数默认是传值(call by value),也就是说,当你调用一个函数时,函数会创建一个新的变量,并将原始变量的值复制到这个新变量中。在函数中对这个新变量所做的任何更改都不会影响原始变量的值。 但是,Python 也支持指针参数(call by reference),也称为引用传递。在这种情况下,函数参数实际上是原始变量的引用,而不是其值的副本。因此,在函数中对参数所做的任何更改都会影响原始变量的值。 要将参数作为指针传递,请在函数定义中将参数前面加上一个星号(*)。例如,以下代码将一个列表作为参数传递给函数,并在函数中修改该列表: ``` def modify_list(lst): lst.append(1) lst.append(2) lst.append(3) my_list = [4, 5, 6] modify_list(my_list) print(my_list) # Output: [4, 5, 6, 1, 2, 3] ``` 在这个例子中,my_list 是一个列表,它被传递给函数 modify_list()。在函数中,我们通过调用 append() 方法来修改该列表。在函数之外,我们打印了 my_list 的值,发现它已被修改。 ### 回答2: Python中的指针参数是一种特殊的函数参数类型,它允许我们传递一个变量的引用,而不是传递变量本身。通过使用指针参数,我们可以在函数内部修改外部变量的值。 在Python中,我们可以通过将变量名作为参数传递给函数来实现指针参数。当我们在函数内部修改该参数时,实际上是在修改指向该变量的引用。这意味着我们可以在函数外部访问和使用修改后的变量值。 使用指针参数有一些重要的注意事项。首先,由于指针参数实际上是变量的引用,所以任何对该引用的修改都将影响到原始变量。其次,在函数内部修改指针参数时,需要注意不要错误地创建新的引用,而是应该始终修改指向原始变量的引用。 下面是一个使用指针参数的简单示例: ``` def modify_list(lst): lst.append(4) my_list = [1, 2, 3] modify_list(my_list) print(my_list) # 输出: [1, 2, 3, 4] ``` 在这个示例中,我们定义了一个指针参数的函数`modify_list`,它将一个列表作为参数,并向列表中添加一个新的元素。在调用函数时,我们传递了名为`my_list`的列表,并修改了这个列表。最后,我们在函数外部打印`my_list`,发现它已经被成功修改。 总之,Python的指针参数提供了一种传递变量引用并在函数内部修改原始变量的机制。通过使用指针参数,我们可以避免在函数调用过程中复制大量的数据,从而提高程序的效率。但同时,我们需要小心处理指针参数,以避免不必要的引用创建和错误的修改。 ### 回答3: 在Python中,函数的参数传递方式有两种:值传递和引用传递。 对于值传递,函数会创建一个参数的局部副本,修改副本不会影响原始参数。这是因为在Python中,基本类型的参数传递都是按值传递的方式,例如int、float、bool等。当我们在函数内部对这些参数进行修改时,只是修改了局部副本,不会影响原始参数的值。 对于引用传递,函数会传递参数引用,而不是副本。这意味着函数内部对参数的修改会影响原始参数。在Python中,不可变类型的参数,如字符串、元组、数值等,都是按值传递的方式,而可变类型的参数,如列表、字典等,则是按引用传递的方式。 可以通过指针参数来修改不可变类型的参数。在Python中,可以使用列表、字典等可变类型的对象作为参数,在函数内部修改这些对象,从而达到修改不可变类型参数的效果。这是因为可变类型的对象在传递时传递的是对象的引用,函数内部可以修改对象的值。 例如,我们可以将一个列表作为参数传递给函数,然后在函数内部通过修改列表元素的值来实现参数的修改。这样就可以达到修改不可变类型参数的效果。 总结起来,Python中的指针参数可以用来修改不可变类型的参数。但需要注意的是,不要滥用指针参数,应该根据实际需要谨慎使用,以避免产生意想不到的副作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值