标签:
在C++中有左值与右值之分,弄清楚它们的关系和区别很重要。当一个对象用作左值时用的是对象的身份(即其内存),当一个对象用作右值时用的是对象的值(即内容)。
例如:
int a = 5,b = 6;
a=b; //a是左值,用的是a在内存中的位置
//b是右值,用的是b的值,即6
取地址符作用于一个对象时取这个对象的地址,返回一个指向此对象的指针。所以取地址符作用一个左值对象,返回值是指针,而指针是一个右值。解引用运算符求值结果是左值。
例如:
int *p;
p的类型为int*,因为解引用运算符生成左值,所以decltype(*p)的结果是int&;因为取地址符生成右值,所以decltype(&p)的结果是int**,所以结果为一个二级指针。
指针函数是函数,就是一个返回指针的函数;函数指针是指针,就是指向函数的指针。两者在形式上很相像,初学者很容易混淆。
例如:int* function(); //指针函数,返回类型为int型指针
int (*pointer)();//函数指针,指向返回类型为int,无形参的函数
函数指针一定不能漏掉括号,漏掉后就成了指针函数了。因为函数调用运算符(即())优先级比解引用运算符(即*)高,所以表达式int* function()中function先与()结合,说明function是一个函数,返回类型为int*;而在第二个表达式int (*pointer)()中,*pointer倍括号括起来了,所以pointer是一个指针,指向一个函数,此函数返回值为int。
由于在程序中多次声明函数指针比较麻烦,所以函数指针多用类型别名。
例如:typedef int (*pointer)(); 这条语句声明了一个指向返回类型为int且无形参的指针类型,类型名为pointer。int (*pointer)()中的pointer本来是一个指针变量,但加上typedef后就成了类型名,可以用pointer声明变量。例如:pointer ptr; ptr是一个指向返回值为int型且无形参的函数指针。
标签:
原文地址:http://www.cnblogs.com/yibo141/p/4606078.html