float *f() 中,()的优先级高于* 所以真正的理解意义为 float *(f());即返回值为双精度型的指针变量
引入typedef 与 signal 举个例子:
void (*signal(int, void(*)(int)))(int);
简化为:
typedef void (*HANDLER)(int);
HANDLER signal (int , HANDLER);
上述是关于函数声明的问题,那么对于变量也存在生命的问题。要理解变量声明,初始化和赋值的问题。
int a = 0;
int b;
b=10;
对于第一个来说这就是一个初始化,在内存中创建空间来保存a这个变量,并将a的值初始化为0,防止一个随机值。对于第二个来说就是一个声明,声明一个整形变量b。第三个就是一个赋值语句,将10这个至赋给变量b,这时候b当作左值来用,代表的是b变量的地址,也就是将10这个值放到b所对应的地址中去。
那现在来说一说左值和右值到底意义是什么。
1>左值可以理解为“=”左边的变量或者常量,对于变量来说,当左值来用的话,代表的是变量在内存中的地址,也就是址属性。
2>右值可以理解为“=”右边的常量或者变量,对于常量来说就是他自身,对于变量来说就是变量中所存储的内容,也就是值属性
比如写一个简单的交换函数
void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
对于这个变量来说,首先创建了一个临时变量temp,并将*a的内容初始化给temp,那么temp中保存的就是*a的内容,也就是a变量的地址,这时候*a就作为一个右值。第二步,*a = *b;根据上面所说的,*a这里就当作一个左值来使用,也就是*a的地址来保存*b的值,第三步也是同样的道理,最终交换的是a和b的地址,从而改变a和b的值。