如下,举了几个栗子,为C语言新手提供一些求学之路的困惑。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef struct Node{
int data;
}Node;
//尝试改变结构体A指针的值 但未能改变 因为改变的只是栈的临时变量。
void test1(Node *a,Node *b){
a = b;
// 事实上,该行代码未能改变实参 指针A的指向的原因是。
// 初始化时,形参指向了实参的位置,后来改变形参的指向,但是并不能改变实参的指向!
}
// 加个引用就可以拿到实参的地址,从而以后对该形参的修改都会影响到实参。相当于采用了隐式二级指针
void test2(Node * &a,Node *b){
a = b;
}
/* 这种方法跟test2方法一个效果,但是这种方法的弊端是,
采用了显式二级指针操作,实参传来的不再是直接指针,而是指针的地址。故每次操作都得加个*
即取到了指针地址,这样就可以对实参指针进行修改了。
*/
void test3(Node ** a,Node *b){
*a = b;
}
/* 修改结构体变量的值,但是达不到效果。因为修改的只是函数栈里的临时变量的值,并未能影响实参。
若想改变实参,那么应该用指针方式或者引用的方式修改。*/
void test4(Node &c){
c.data = 51;
}
int main(){
Node *a = new Node();
a->data = 10;
Node *b = new Node();
b->data = 100;
test1(a,b);
cout<<a->data<<endl;
// test2(a,b);
test3(&a,b);
cout<<a->data<<endl;
Node c = {50};
test4(c);
cout<<c.data<<endl;
return 1;
}