1.對於c++的九種內置基本類型來說。在程序中出現該名稱,即表示指向該類型的一個變量(或常量等)。通常我們對於變量作爲右值,即去變量地址空間的值。但對於數組名和函數名則不同(因爲數組的值和函數值很難或無法表示)。如:
int arr[2] = {0, 1}; //c++規定數組名代表指向首元素的地址,即數組名作爲右值,取的是第一個元素的地址(如果取數組空間的值很難表示,另外數組名作爲指針並不表示該指針開闢空間存儲下了),即數組名是一個常量的int型的指針。&arr表示一個指向數組的指針。兩者值一樣,但類型不同。
#include<iostream>
using namespace std;
int main()
{
int arr[2] = {1, 2};
//if(arr == &arr) //error 類型不匹配
// cout << "equal" << endl;
cout << arr << endl;
cout << &arr << endl;
return 0;
}
輸入的結果是一樣的。
2.函數上面所述類似,但函數名即表示一個指向該函數類型的一個指針。&func = func = *func c++的這種規定是有一定意義的。原因和數組的規定類似。
#include<iostream>
using namespace std;
void func() { cout << "ok" << endl; }
void (*func2)();//指向函數的指針,函數名是一個const函數指針,那麼雖然*func2內容不可以改變,但第二層指針func2可以改變(雖然第一層指針和第二層指針指向的是同一地址,訪問權限是和變量名相關的。故雖是一個地址,但用第二層指針可以改變),見下面代碼(void (*func2)(){}這樣定義是錯誤的,用函數類型指針去定義一個指針,不能加上該類型的定義體,就想不能int *i = 1;這樣定義)。
int main()
{
if(&func == func && func ==*func)
cout << "all equal" << endl;
func2 = &func;
func2 = func;
func2 = *func;
func2();//對於函數名來說,掉用其指針和調用其名稱是一樣的。
return 0;
}
上面程序可以正確運行。
3.對於typedef void Func(int i);這裏Func類型名不在是一個指針而是以具體的函數類型名(對於直接定義的void func()中func是一個指針)。以下初始化賦值是錯誤的。
typedef void Func();
void func(){}
int main(int argc, char *args[])
{
Func fun = func;
}
因爲右邊是一個指針,左邊定義的是一個函數對象,由於現在還不知道如何直接給一個函數對象賦值,一般會用指針Func *fun = func;
更經常使用的是typedef void (*Func)(int i);
以上說明函數也有類型也可以示例一個對象,體現了一切都是對象的思想(對象都可以去其地址,但對於類型來說不行如&int或&C(C爲class)不行)。