指针用法 与 参数传递 问题

来源:百度知道 编辑:UC知道 时间:2024/05/09 16:36:31
我学过VB,学C没几天,老师是英文授课,所以只能靠自己琢磨了。。。
指针作为C/C++的特色,我不能完全理解

下面的代码是老师的示例
代码中有两段输出语句,第一次的输出结果是有变量声明的时候初始化的,第二次的应该是由人输入的

代码一有逻辑错误,不能达到效果,两次的输出结果没有改变
代码二是代码一的修正版本,第二次的输出结果因为取决于人工输入,所以可以和第一次的输出结果不同

这两段代码主要用来讲参数传递的,有用到指针

我不明白这里的指针是怎么实现参数传递的,值是怎么从调用函数的参数XYZ传递到PQR中的
谁能帮我详细解说一下?
最好能有示意图进行辅助~

下面的老师示例的两段代码
代码一:
/* a program to test parameter passing by reading some numbers in a function */
/*

WARNING! This version is NOT working!

*/
#include <stdio.h>

void read_some_numbers( int x, int y, int z ) ;

main()
{ int p, q, r ;

p = 10 ; q = 20 ; r = 30 ;

printf ( "value of p is %d \n", p );
printf ( "value of q is %d \n", q );
printf ( "value of r is %d \n", r );

read_some_numbers ( p, q, r ) ;

printf ( "value of the new p is %d \n", p

不就相当于VB里的ByVal和ByRef么?
http://zhidao.baidu.com/question/54864977.html

int F(int x){return 3*x;}
main
{
int a=2;
F(a);
}
上面的例子,a是实参(函数被调用),x是形参(函数定义)。
把a的值复制一份给x,然后运算,实参a的地址和值是【永远不变】的。

如果还有一个函数
int F2(int *px){return *px=3;}
main()
{
int a;
F2(&a);
}
a的值改变了,难道我上面说错了?
不!这次是【&a】作为实参!我没有说错。

为了看得更清楚,我们又申请了一个变量
main()
{
int a;
int* p = &a;
F2(p);
}
和第一个比较一下,明白了吗?

这是 值传递 和 地址传递 的问题

只需记住:值传递 那么形参的任何改变不影响实参。因为 形参 和 实参 都有各自的内存单元,二者没联系。调用函数 read_some_numbers 只是把形参内存单元中的数值改变了,返回到主函数中,实参还是没变。

地址传递 的话 因为 形参 和 实参 共用同一个地址 所以对 形参 所对应的地址中内容改变 必然会 改变 实参 的值, 因为 实参对应的 数值 也是响应地址中的 数值。 地址传递也可以这么认为:给实参起了一个别名,对真名和别名操作都会对其有影响。