c语言的符号和引用问题

c 语言中有两个符号,一个是*,一个是&,有时写一个函数时如qq(int *q);
有时确是qq(int &q),有时是qq(int q);他们用的场合还不一样,希望大家能详细解释
能解释的好,最好有例子,再加分

qq(int* q)中的(int* q)是qq这个函数的形参表,int* q表示的是q是一个指向int对象(或数据类型)的指针,即该函数接受一个int型指针为参数;

至于qq(int& q),这个貌似只有在C++中才见得到吧,该句的意思是函数qq接受一个int类型的引用(引用只有在C++等语言中才有)q。

而qq(int q),表示的是qq这个函数接受一个整形的数据q。

默认情况下,C/C++是按值传递(对于C则是任何时候都是按值传递),也就是说当你调用一个接受参数的函数的时候,该函数的形参是原参数的一份拷贝,举例:

void qq(int a) // 形参是a局部变量
{

a++; // 只改变形参,不会影响b

}// a在此时被自动销毁

int main()
{
int b = 1;
qq(b);
printf("%d", b); // 打印出1
}

可以看出在传值给函数qq的时候,a仅仅作为b的一份拷贝,他们所驻扎的存储空间是不一样的,所以改变a不会影响b。

当然在C中传指针时也是按值传递,

void qq(int* a)
{
*a = 1989; // a存储着b的地址,*a用于获得驻扎在该地址的b的值
} // 指针a在此时也被自动销毁,

int main()
{
int b = 1;
qq(&b); // 按值传递,传递的是b的地址
printf("%d", b); // 打印出1989
}

这一次qq的形参a是一个指针,所以接受的是b的地址的拷贝(地址是一个长整形数据)而不是b的拷贝,当在函数qq中使用*a = 1989时,*a把b的地址所存储的值改变为1989,所以外部世界的b的值(这里指的是main中的b,外部是相对于函数qq而言)也随之改变。

而对于函数qq(int& a),这是C++中引入的一个新类型:引用,所带来的新的函数传值方式,即按引用传值。举例:

void qq(int& a) // a可以看作是b的别名,a其实和b拥有相同的内存地址
{
a = 1989;
} // a被销毁了吗?

int main()
{
int b = 1;
qq(b); // 看起来像按值传递
printf("%d", b); // 结果和上面的一样,也是1989
}

引用的意义是指代原对象本身,也可以理解为别名,比如某人被别人起了多个外号,小a,大q,傻x,而他本人可能叫w,但不管是小a,大q,傻x还是w,其他人都知道他们是同一个人。因此对传入qq的参数a可以理解为main中b的别名,即等价于main中的b,所以任何对a的操作其实就是对b的操作,因此main中b的值最后也发生了改变。

简单地加以概括,其实函数传值就那么2种类型:

1、改变实参的值。

如传指针或引用时改变他们所引用对象的值。

2、不改变实参的值。

一般的按值传递。

这下应该很容易理解了吧。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-07-18
首先你要搞清楚这两个符号的含义
(1) int &rval1 —— 这个是定义一个引用
(2) int ival = 1;那么符号&ival则表示取ival的地址
(3) int *pi 表示定义一个指针
(4)int ival = 1;
int *pi = &ival;
这个是把ival 的地址赋值给pi这个指针
那么下面如果出现*pi则表示的是指针pi所指的内容(也就是它的值,这里是1)
下面再来解释你的问题:

1.有时写函数时如qq(int *q);
这里是用一个指向整型数的指针来作为函数的形式参数,也就是说在函数调用的过程中传递的是指针变量

2.qq(int &q),
这里是一个引用作为函数qq的形式参数,如果说实际参数是a,即调用的时候这样写,qq(a);那么就等价于在子函数qq中 int &q=a q就是a的别名!

3.qq(int q) 这里就是一个整型数作为形式参数了,实际参数的值就等于形式参数q的值。

指针和引用确实很难理解,要多看书 多理解 多运用才能很好掌握!

PS 楼上有一点说错了,
int *q;
int a=2;
q=a; //应该是q=&a!
第2个回答  2007-07-19
*在声明变量时作为指针类型的标志存在,在利用指针时作为间接访问符存在。
例子:
int *q;//定义一个整型指针变量q
int a=2;
q=&a;//让指针q指向a,则*q就表示a的值2,若调用printf("%d",*q);则输出为2
&是取地址符,得到其后变量的地址
最常见的运用:
int q;
scanf("%d",&q);//因为scanf函数是将键盘输入的值传递给变量的地址,所以这里必须使用&来获得q的地址
因为作用不一样,当然用的场合也不会一样

参考资料:认真答题很累,请勿复制

相似回答