指針與數組及函數關係

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)不行)。

發佈了30 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章