陣列中每個元素都是物件,即占有特定型別的記憶體空間。
陣列名可以轉化為這個陣列物件的首個元素的位址。
這裡我們不去討論一維陣列,直接從二維說起。所謂二維陣列也是陣列,只不過它的元素也是乙個陣列。
首先我們寫乙個二維陣列留作使用
#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 函式指標定義 函式型別 指標變數名 形參列表 函式型別 說明函式的返回型別,由於 的...