陣列 陣列指標和函式指標

2021-10-10 23:07:40 字數 4817 閱讀 4393

陣列中每個元素都是物件,即占有特定型別的記憶體空間。

陣列名可以轉化為這個陣列物件的首個元素的位址。

這裡我們不去討論一維陣列,直接從二維說起。所謂二維陣列也是陣列,只不過它的元素也是乙個陣列。

首先我們寫乙個二維陣列留作使用

#include

using

namespace std;

int a[

10]=,

};

void

test01()

a 與 a + 1 正好相差40個位元組,代表 a 是這個一整行物件的位址,即首行位址。

也就是,陣列名 a 自動轉化成指向第乙個元素的指標, 那麼這個指標是什麼型別呢?

編譯器會把它識別成 int (*) [10]。也即這個指標指向了第一維陣列,陣列作為物件,占有一塊陣列型別的記憶體空間。因為物件是指一塊能儲存資料並且具有某種型別的記憶體空間。

我們解引用一下:

void

test03()

一般宣告陣列的時候都有:

int arr[10]

;//int* parr[10]

;//陣列裡面裝的指標

如何宣告乙個指向陣列物件的指標呢?其實剛才已經一不小心就把 int (*)[10] 這個型別引入出來了,通過typeid 我們又發現他是pa10_i,照書上說的由內向外,以外國人的思維,先說重點的後說細節的翻譯:這是一種指標(p),指向了乙個陣列物件(a),陣列裡面有10個小物件,這些小物件是int型。

int

(*p)[10

];int(

&ref)[10

]= a[1]

;//將ref 引用繫結到a[1]這個物件 ,注意了是指第二行整體。

如果換乙個想法的話好像更好理解,括號運算子先執行,這個引數解引用後是乙個陣列物件,這個陣列物件有10個元素。

由此看來,對於陣列來說,宣告都是這個調調,比普通變數宣告多了乙個維度說明

舉例:

void

test04()

// 1 2 3 4 5 5 6 7 8 8

// 10 12 32 42 51 15 16 71 121 18

}

可以用型別別名來簡化

typedef

int int_array[10]

;using intarray=

int[10]

;

於是:

void

test05()

// 1 2 3 4 5 5 6 7 8 8

// 10 12 32 42 51 15 16 71 121 18

}void

test06()

// 1 2 3 4 5 5 6 7 8 8

// 10 12 32 42 51 15 16 71 121 18

}

用auto型別說明符,更方便點,但是,這裡必須明確,row是對a每一行的引用。如果沒有&,row被轉化為陣列名,也就是每一行第乙個元素的位址,不具備迭代功能:

void

test07()

// 1 2 3 4 5 5 6 7 8 8

// 10 12 32 42 51 15 16 71 121 18

}

如何讓乙個函式返回陣列指標:,利用之前的思路: int (*p)[10], 我們很快能理解,讓對乙個func返回的結果解引用後是乙個陣列:

type (*func( paramlist))[dimension];

int(*

altarray

(int i))[

10]// // 這裡想用i去替換陣列裡的數,並且返回乙個新的陣列,當然也會改變原來的陣列,這裡只是為了返回乙個陣列玩玩

return a;

}// 當然可以簡化一下

int(

*altarrayi

(int i))[

10]return a;

}// 型別別名:

intarray *

altarrayiii

(int i)

return a;

}

我們也可以用 decltype 簡化型別名, 注意:decltype 並不將陣列型別轉成對應的指標,但是我們可以用取址符得到這一指標

decltype

(&a[0]

)altarrayii

(int i)

return a;

}

還有一種就是在leetcode中經常見到的位置返回型別

auto

altarrayiv

(int i)

->

int(*)

[10]return a;

}

我們用陣列指標傳參:

void

printarray1

(intarray *p)

cout << endl;

} cout << endl;

}

測試:

void

test08()

我們宣告一般是這樣的:

int arr[10]

;int

* parr[10]

;int

(*p)[10

];intfunc1

(int i)

;int

*func2

(int i)

;int

&func3

(int i)

;int(*

altarray

(int i))[

10];

那如何宣告乙個函式指標呢?

// 書上的例子

bool

lengthcompare

(const string &

,const string &);

bool

(*pf)

(const string &

,const string &

);

就是解引用以後是乙個bool函式;也就是乙個指向bool函式的指標。

如何初始化呢?龜龜,與int (*p)[10]; 好像啊,都是具有自己的特點,函式就是帶引數列表的變數,陣列就是帶維度的變數,這麼說應該也沒錯吧。

void

test09()

可以用指標表示 當然也可以傳遞,我們過載一下 altarrayiii , 測試將輸出陣列的函式printarray1的指標傳給它:

// 型別別名:

typedef

void

(*printarray)

(intarray *);

intarray *

altarrayiii

(int i, printarray pfa)

cout<<

"修改後:"

<< endl;

pfa(a)

;return a;

}// 測試:

void

test10()

這一塊在函式宣告了解以後應該不難理解,目的是讓乙個函式返回乙個函式的指標, 用個小栗子:

int

myadd

(int a,

int b)

intmysub

(int a,

int b)

using fp =

int(*)

(int

,int);

// 確定一下型別,等會好操作

fp test

(bool issub)

// 要返回乙個指標,指標解引用後是乙個函式

void

test11()

複雜一下,將今天所有的都寫上:

void

altarrayandprint

(int i, printarray pfa)

cout<<

"修改後"

<< endl;

pfa(a);}

auto

testreturnfuncpointer3()

->

void(*

)(int, printarray )

void

test12()

下面是回的四種寫法,不用看了。

using altptr =

void(*

)(int, printarray )

;typedef

decltype

(altarrayandprint)

*func;

typedef

void

(*func2)

(int

, printarray )

;altptr testreturnfuncpointer()

func testreturnfuncpointer1()

func2 testreturnfuncpointer2()

intmain()

陣列指標和指標陣列 函式指標和指標函式

一 陣列指標與指標陣列 1,指標陣列 所謂指標陣列,就是指標組成的陣列,即陣列的元素為指標 int pa size size為元素數目,元素的值為int型別的指標 2,陣列指標 所謂陣列指標,就是指向陣列的指標,即其是乙個指標,指向陣列。int pa size size為陣列的元素數目,pa指向乙個...

指標陣列 陣列指標 函式指標 函式指標陣列

陣列指標 指向陣列的指標,是乙個指標,其指向的型別是陣列 指標陣列 元素為指標的陣列,是乙個陣列,其中的元素為指標。例如 int a 5 這個是陣列指標。int a 5 這個是指標陣列。定義函式指標型別 int max int,int typedef int fun ptr int,int 申明變數...

函式指標和指標函式 陣列指標和指標陣列

函式指標 在程式執行中,函式 是程式的演算法指令部分,它們和陣列一樣也占用儲存空間,都有相應的位址。可以使用指標變數指向陣列的首位址,也可以使用指標變數指向函式 的首位址,指向函式 首位址的指標變數稱為函式指標。1 函式指標定義 函式型別 指標變數名 形參列表 函式型別 說明函式的返回型別,由於 的...