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的值。