指针是C/C++中的一种数据类型,其下可有指向各种数据类型的指针类型.(包括用户自定义类型),函数指针是其中的一种.不过指向的对象是函数,在楼上推荐的帖子中对数组指针及指针数组作了详尽的分析这里就不重复了.引用是C++中加入的,怯以为本质上与指针差别不大.但是引用是必须被初始化的.如可以有如下的指针定义
INT *P;
但不能有
INT &P;
在传递参数时分为传值与传址.传值是在被调用函数所在区域做一个被传参数的拷贝,既然是拷贝了被传参数,那么在函数中对形参的改变不会影响到被传参数.传址是指传送的对象为指针或引用,再传递时被调函数得到的是被传数据的地址,在被调函数中对原被传数据的地址直接进行操作将影响到实参的值,实参的值有可能被改变.
另外,在返回值时是应特别注意不要返回一个局部对象的指针或引用.
-------------------------------------------------------------------------------------------------------------------------
指针有指向变量的指针,指向变量的地址;也有指向函数的指针,指向函数的入口地址;
引用是这样申明一个变量:int &a;a看起来像一个变量,但任何对a的操作,特别是在传参过程中,在子函数中对a的赋值都会对主函数中的a产生影响。这就使a用起来像一个指针。
传参有传值,传址两种传参方式,传值不会对影响原来的变量,而传址会。
----------------------------------------------------------------------------------------------------------------
。 指针有指向变量的指针,指向变量的地址;也有指向函数的指针,指向函数的入口地址;
2。 引用是这样申明一个变量:int &a;a看起来像一个变量,但任何对a的操作,特别是在传参过程中,在子函数中对a的赋值(a=10;)都会对主函数中的a产生影响。这就使a用起来像一个指针。
3。 传参有传值,传址两种传参方式,传值不会对影响原来的变量,而传址会。
---------------------------------------------------------------------------------------------------------------
下面说说我对传值的看法。首先明确一点,就是楼上几位说的,传值是调用函数是参数传递的一种方式。对于传值是否会修改实参,我看要分情况而论。如果传递的是基本类型,比如int,float,double,char等,那么在进行参数拷贝的时候,仅仅就是一个值拷贝的问题。也就是说,在函数中的参数与外界的实参是不相干的,除了形参仅仅被实参初始化赋值以外。那么在函数中,对形参的任何修改,都不会影响实参。一个辅助的想法,就是形参和实参的关系,好比这样的两个变量:
int a=1;
int b=a;//a相当于实参,b相当于形参。
b=3;//b修改了,但是a不会变化。
总之,实参的作用仅仅在于给形参作初始化赋值,除此以外,没有作用。
但是当我们面对的实参是一个对象,而不是简单的类型的时候,问题就来了。这时候,是否形参真的与实参没有关系,除了初始化赋值之外呢?答案是不确定的。为什么?这得涉及到拷贝构造函数的问题了。特别是当类中存在指针等类型的时候。如果拷贝构造函数是系统默认的,或者你设计函数的时候,没有处理好,那么当参数传递的时候,就会调用糟糕的拷贝构造函数。而在函数中,如果你对对象的指针项作了修改,毫无疑问会影响实际参数。问题就要严重了。危机似乎产生了。怎么办?还好我们有安全的办法。那就是构造足够安全的拷贝构造函数,或者传引用。对于传引用,根据情况,如果需要对对象进行修改,就使用FunctionName(ClassName &obj//,...);否则,就使用FunctionName(const ClassName &obj//,...).
好了,最后作个总结。就是对于标准类型,传值调用是安全的。而对于对象等,得慎重对待。如果您觉得这个规则有些麻烦,那么请使用传引用吧。至于如何传引用,敬请高手指点
------------------------------------------------------------------------------------------------------------------
1。指针也是变量,里面的内容是其他变量在内存中的地址。
2。函数名就是那个函数的入口地址,函数指针指向哪个函数,就把哪个函数的入口地址赋给函数指针,所以:
double(*pfun)(double);
pfun=sin;
double x=(*pfun)(3.14);
与x=sin(3.14)一样。
3。传值调用。把实参的右值(即内容,不可被赋值)传递进来,所以函数内部改变形参不会影响实参。
4。传址调用。把实参的左值(即地址,可被赋值)传递进来,所以函数对形参的改变,相当于直接修改了实参地址里的内容。c中没有引用,传址功能可以实现c++中的引用。
5。引用,相当于传址。但通常的说法是别名。
也就是说形参是实参的另一个名字,两个符号指向一个地址,修改形参,会改变实参。
个人之见,欢迎更正
-----------------------------------------------------------------------
大家说得都很对!但我还想听听大家对函数指针的理解,希望大家支持!!!
这里我先说说我对函数数指针的肤浅认识,
我认为所谓函数指针就是一个函数执行的开始端的地址.只要你把一个函数的这个入口地址找到就可以调用他.
例如:在调用一个函数时
void fun1(){
......
........
}
void fun2(){
.....
fun1();//在这里其实就是通过funl()的表识符的作用直接跳到
函数fun1()执行,执行完后再返回.
.......
}
还有用函数指针作为参数
例如:
void fun(int a,void(*p)(int)){
int a;
cin>>a;
p(a);//这里执行的就是函数fun2();
.........
}
void fun2(int b){
.........
........
}
void fun3(){
int c;
cin>>c;
........
fun1(c.fun2);//这里实现了函数指针作为参数的传递;
........
}
//不知我说的对不对,如果有错误希望大家指出,也希望大家多多发表自己对函数指针的认识和看法,让小弟能够真正了解他的来龙去脉.
-------------------------------------------------------------------------------------------------------------
总结一下~
1、关于传值与传址及引用:
传值是在被调用函数所在区域做一个被传参数的拷贝,既然是拷贝了被传参数,那么在函数中对形参的改变不会影响到被传参数.也就是说函数的参数不具备返回值的能力.
传值调用.把实参的右值(即内容,不可被赋值)传递进来,所以函数内部改变形参不会影响实参.
传址是指传送的对象为指针或引用,再传递时被调函数得到的是被传数据的地址,在被调函数中对原被传数据的地址直接进行操作将影响到实参的值,实参的值有可能被改变.
传址调用。把实参的左值(即地址,可被赋值)传递进来,所以函数对形参的改变,相当于直接修改了实参地址里的内容。c中没有引用,传址功能可以实现c++中的引用。
2、指针与引用(reference):
指针的提领(dereference,"指向"的意思)标记 * 用在声明中,表示声明的对象是指针;用在表达式中,表示取指针所指向的那个元素。
引用的标记 & 用在声明中,表示声明的对象是一个引用;用在表达式中,叫做取址运算符,表示取得对象所在的内存地址,而非对象的值。
我不明白~
指向指针的指针~int ** p;
和指向引用&的指针~int *&p;
怎么回事?
----------------------------------------------------------------------------------------------------
1 int i; //定义一个int型的变量
2 int *p; //定义一个指向int的指针
3 int a[n]; //定义一个数组
4 int *p[n]; //定义一个指针数组
5 int (*p)[n]; //定义一个数组指针
6 int f(); //声明一个返回值为int的函数
7 int *p(); //声明一个返回值为int*的函数
8 int (*p)(); //定义一个函数指针
9 int **p; //定义一个指向int的指针的指针
-----------------------------------------------------
1 int i; //定义一个int型的变量
2 int *p; //定义一个指向int的指针
3 int a[n]; //定义一个数组
4 int *p[n]; //定义一个指针数组
5 int (*p)[n]; //定义一个数组指针
6 int f(); //声明一个返回值为int的函数
7 int *p(); //声明一个返回值为int*的函数
8 int (*p)(); //定义一个函数指针
9 int **p; //定义一个指向int的指针的指针
--------------------------------------------------------------------------------------