C语言理解指针作为形参作用域

当指针作为实参时,究竟指针所指向的值在经过function后有没有改变?接下来做一下尝试以及分析。

#include <iostream>
#include <stdlib.h>
using namespace std;

typedef struct node *Node;
struct node{
	int element;
}newNode;

int test1(Node node){
	cout<<"test1 adress:"<<&(node->element)<<endl;
	cout<<"test1:"<<node->element<<endl;
	Node b;
	b =(Node)malloc(sizeof(newNode));
	b->element = 2;
	node = b;
	cout<<"test1 change adress:"<<&(node->element)<<endl;
	cout<<"test1 change:"<<node->element<<endl;
	return 1;
}

int test2(Node node){
	cout<<"test2 adress:"<<&(node->element)<<endl;
	cout<<"test2:"<<node->element<<endl;
	node->element = 2;
	cout<<"test2 change adress:"<<&(node->element)<<endl;
	cout<<"test2 change:"<<node->element<<endl;
	return 1;
}

int main(){
	Node a;
	a = (Node)malloc(sizeof(newNode));
	a->element = 1;
	cout<<"source adress:"<<&(a->element)<<endl;
	cout<<"source element:"<<a->element<<endl<<endl;
	int stat = test1(a);
	cout<<"source test1 return adress:"<<&(a->element)<<endl;
	cout<<"source test1 return element:"<<a->element<<endl;
	cout<<endl;
	int stat2 = test2(a);
	cout<<"source test2 return adress:"<<&(a->element)<<endl;
	cout<<"source test2 return element:"<<a->element<<endl;
	return 0;
}

上述代码都将结构体指针作为实参传递给test1和test2,不同的是在test1中新创建一个Node,并且赋值给传递过来的结构体node,而在test2中直接修改node的element,大家猜猜输出是怎么样的呢?

上图为输出,奇怪的是经过test1后,main中的Node a中的element没有改变,但是经过test2后由1变为了2。实际上,当作为实参进行传递时,在test*函数中都会为传递参数申请一个新的地址,但是仅为形参申请新的地址,例如在test2中,形参中的element元素的地址不变,由此真相大白,test1中在新的地址申请了新的内存空间得到Node b,此时形参node实际上并不是和main中的a为同一个地址,因此将b赋值给node对a不造成任何影响。而test2中,虽然node是一个新的地址,但是其元素element和main中a的element是同一个地址,因此修改node中的element就是修改a中的element。由此得出结论形参会申请新的地址,但形参本身的元素不会申请新的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值