開始學的時候對于陣列,指標,函式的一些細節問題不是那么明白,整理了一下;
指標陣列
顧名思義指標陣列是個陣列,是存放指標的陣列;例如:int *arr[5] 指標陣列arr是有5個元素,每個元素是int*; 同理 char *arr[5] 指標陣列arr是有5個元素,每個元素是char*;

陣列指標
陣列指標是指向陣列的指標,例如:int (*arr)[5] 意思是arr指標指向一個陣列,該陣列含有5個元素,每個元素都是int, char* (*per)[5]意思是per指標指向一個陣列,該陣列含有5個元素,每個元素都是char*;

方括號和解參考符號功能是一樣的,用陣列指標來表示圖中a[2][3]的值——(*(arr+2))[3]、還能寫成 *((*(arr+2))+3);
一維陣列傳參
int main()
{
int arr[3];
test(arr);//arr是一維陣列首元素地址
}
函式形參該拿什么接收?
//1.
void test(int arr[3])
{}
//2.
void test(int arr[])//其實2和1是屬于一種,方括號里可以寫數字也可以不寫
{}
//3.
void test(int* arr)//實參穿的地址,拿一級指標來接收
{}
二維陣列傳參
int main()
{
int arr[3][5]={0};
test(arr);//傳的是第一排的地址 &arr[0]
}
函式形參該拿什么接收?
//1.
void test(int arr[3][5])
{}
//2.
void test(int arr[][5])//第一個變數可以不可,第二個變數必須寫
{}
//3.
void test(int (*arr)[5])//3*5的二維陣列,當成3個一維陣列,拿陣列指標來接收
{}
當函式形參為一級指標時
函式是:void test(int *p){},
int main()
{
int a = 10;
int *p1 = &a;
int arr[10] = { 0 };
//以下可以使用
test(&a);
test(p1);
test(arr);
}
當函式形參為二級指標時
函式是:void test(int **p){},
int main()
{
int a = 10;
int* pa = &a;
int **ppa = &pa;
int *arr[5];
//以下可以使用
test(ppa);
test(&pa);
test(arr);
}
函式指標
函式指標是指向函式的指標

函式地址不存在首地址一說,函式指標變數和陣列指標變數差不多;

分別用函式名,函式指標變數呼叫函式的形式:
例題1:分析 (*( void (*)() ) 0)() 這個代碼什么意思;(此題來源于《C陷阱與缺陷》)
這個題就說明了函式指標的用途,有人說有函式名可以直接呼叫為什么還那么麻煩使用函式指標變數;函式指標變數就用于不知道函式名的情況,就是說函式指標變數呼叫指定地址的函式;把0用(函式指標變數)強制轉化成函式的地址,再進行呼叫;
(注意:在當前作業系統上,0地址不允許被訪問,在允許訪問的基礎下,只能用上面那個)
例題2:分析 void (* signal (int, void(*)(int) ) )(int) 這個代碼什么意思;


總結:在分析此類問題時,從函式定義,函式宣告,函式呼叫三方面考慮!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294516.html
標籤:其他
上一篇:演算法圖解1-二分法與大O表示法
下一篇:github開發人員在七夕搞事情:remote: Support for password authentication was removed on August 13, 2021.
