当指针作为实参时,究竟指针所指向的值在经过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。由此得出结论形参会申请新的地址,但形参本身的元素不会申请新的地址。