指针、引用与形实参传值
2010-04-15 19:22
127 查看
样例程序:
#include<stdio.h>
struct aa
{
int a;
int c;
int d;
int k;
int m;
};
void init(struct aa n)
{
n.a=0;
n.c=0;
n.d=5;
}
struct aa edit(struct aa n)
{
n.a=5;
n.c=10;
n.d=n.a+n.c;
return n;
}
void main()
{
struct aa mm,nn,bb;
init(mm);
bb=edit(nn);
printf("%d/n%d/n%d",bb.a,mm.d,nn.a);
}
编译输出:
5
-858993460
-858993460
两个疑问:1、为什么init(mm)没有改变mm的值;2、nn.a的输出为什么是随机数
解答:1、当init()函数被调用时,要在栈里创建一个struct aa n的局部变量。然后main()中调用的init()只是修改了局部变量n,并没有修改main()定义的mm。
2、同理1
利用指针修改样例程序:
#include<stdio.h>
struct aa
{
int a;
int c;
int d;
int k;
int m;
};
void init(struct aa *n)
{
n->a=0;
n->c=0;
n->d=5;
}
struct aa edit(struct aa *n)
{
n->a=5;
n->c=10;
n->d=n->a+n->c;
return *n;
}
void main()
{
struct aa mm,nn,bb;
init(&mm);
bb=edit(&nn);
printf("%d/n%d/n%d",bb.a,mm.d,nn.a);
}
输出:
5
5
5
此时,init(mm)已经修改了mm的值,这是因为使用指针做形参时,init()作用的是main()中传入的地址,所以init()修改的是main()
中的变量。edit()同理。
利用引用修改样例程序
#include<stdio.h>
struct aa
{
int a;
int c;
int d;
int k;
int m;
};
void init(struct aa& n)
{
n.a=0;
n.c=0;
n.d=5;
}
struct aa edit(struct aa& n)
{
n.a=5;
n.c=10;
n.d=n.a+n.c;
return n;
}
void main()
{
struct aa mm,nn,bb;
init(mm);
bb=edit(nn);
printf("%d/n%d/n%d",bb.a,mm.d,nn.a);
}
输出:
5
5
5
输出结果与指针的输出结果一致。&是C++引入的概念,功能可以认为与指针等价。所以输出的结果与指针一致。
#include<stdio.h>
struct aa
{
int a;
int c;
int d;
int k;
int m;
};
void init(struct aa n)
{
n.a=0;
n.c=0;
n.d=5;
}
struct aa edit(struct aa n)
{
n.a=5;
n.c=10;
n.d=n.a+n.c;
return n;
}
void main()
{
struct aa mm,nn,bb;
init(mm);
bb=edit(nn);
printf("%d/n%d/n%d",bb.a,mm.d,nn.a);
}
编译输出:
5
-858993460
-858993460
两个疑问:1、为什么init(mm)没有改变mm的值;2、nn.a的输出为什么是随机数
解答:1、当init()函数被调用时,要在栈里创建一个struct aa n的局部变量。然后main()中调用的init()只是修改了局部变量n,并没有修改main()定义的mm。
2、同理1
利用指针修改样例程序:
#include<stdio.h>
struct aa
{
int a;
int c;
int d;
int k;
int m;
};
void init(struct aa *n)
{
n->a=0;
n->c=0;
n->d=5;
}
struct aa edit(struct aa *n)
{
n->a=5;
n->c=10;
n->d=n->a+n->c;
return *n;
}
void main()
{
struct aa mm,nn,bb;
init(&mm);
bb=edit(&nn);
printf("%d/n%d/n%d",bb.a,mm.d,nn.a);
}
输出:
5
5
5
此时,init(mm)已经修改了mm的值,这是因为使用指针做形参时,init()作用的是main()中传入的地址,所以init()修改的是main()
中的变量。edit()同理。
利用引用修改样例程序
#include<stdio.h>
struct aa
{
int a;
int c;
int d;
int k;
int m;
};
void init(struct aa& n)
{
n.a=0;
n.c=0;
n.d=5;
}
struct aa edit(struct aa& n)
{
n.a=5;
n.c=10;
n.d=n.a+n.c;
return n;
}
void main()
{
struct aa mm,nn,bb;
init(mm);
bb=edit(nn);
printf("%d/n%d/n%d",bb.a,mm.d,nn.a);
}
输出:
5
5
5
输出结果与指针的输出结果一致。&是C++引入的概念,功能可以认为与指针等价。所以输出的结果与指针一致。
相关文章推荐
- 指针与引用的区别
- C++ 引用和指针
- c++指针和引用的区别
- C/C++中指针和引用之相关问题研究
- 引用传参和指针传参的差别.
- 引用和指针的区别
- 指针与引用的区别
- 值传递、指针传递、引用传递
- c++中的引用与指针的区别
- c++中指针与引用的区别
- C语言——结构体与指针引用&结构体数组与指针引用
- C++指针与引用
- 踏雪有痕-指针和引用
- 引用、指针的使用对比(注意* &符号不要用乱了)
- C++中的引用与指针的区别
- 指针作为函数的参数,引用作为函数的参数
- C++中按引用传递 和 指针
- c++ STL 常用容器元素类型相关限制 指针 引用
- C++中引用、指针与const之间的爱恨情愁
- C语言 多级指针 解引用