1.自定義數組類型
typedef int (Array)[5];
Array
是一個類型爲int
長度爲5的數組類型,即定義一個Array a;
那麼a就是一個類型爲int長度爲5的數組,所以a的使用方法和數組一致。
typedef int(Array)[5];
Array a;
int i = 0,j = 0;
for (i = 0; i < 5; i++)
a[i] = i;
for (j = 0; j < 5; j++)
printf("%d,", a[j]);
2.自定義指向數組的指針類型
typedef char(*Arrayptr)[8];
Arrayptr
是一個指向char
類型的長度爲8的數組的指針類型,此類型的指針只能指向char
類型的長度爲8的數組。且每一次指針移步,移動的距離是1*8=8字節。
需要注意的是()
不能省略,否則定義就會變義。
除了自定義指針類型來指向一個固定的數組外,C還可以直接定義一個指向固定數組的指針變量。
int (*p)[5];
p
就是一個指向類型爲整型且長度爲5的數組的指針變量。
3.自定義函數類型
typedef int (Funptr)(int a, int b);//函數類型
int Fun1(int a, int b)
{
return a + b;
}
void Fun2(Funptr *p)
{
printf("%d\n", p(1, 2));
}
int main()
{
Funptr *p = &Fun1;
Fun2(p);
system("pause");
return 0;
}
Funptr
是一個指向返回值爲int
參數列表爲int,int
的函數的類型,通過Funptr
函數類型的指針可以將返回值爲int
參數列表爲int,int
的函數當作參數來使用,使函數的調用更爲靈活。
除了定義函數類型可以達到這種效果,我們還可以直接定義指向函數的指針類型來實現函數參數化,如:
typedef int (*Funptr)(int a, int b);
int Fun1(int a, int b)
{
return a + b;
}
void Fun2(Funptr p)
{
printf("%d\n", p(1, 2));
}
int main()
{
Funptr p = &Fun1;
Fun2(p);
system("pause");
return 0;
}
這樣的效果和定義函數類型是一樣的。
當然我們還可以直接定義一個指向函數的指針變量,來實現同樣的效果,如:
int Fun1(int a, int b)
{
return a + b;
}
void Fun2(Funptr p)
{
printf("%d\n", p(1, 2));
}
int main()
{
int(*p)(int a, int b) = &Fun1;
Fun2(p);
system("pause");
return 0;
}
我們還可以這麼做,一樣能達到相同的效果:
int Fun1(int a, int b)
{
return a + b;
}
void Fun2(int (*ptr)(int a,int b))//直接定義函數指針的形參
{
printf("%d\n", ptr(1, 2));
}
int main()
{
Fun2(&Fun1);//直接傳遞函數地址
system("pause");
return 0;
}
搞了那麼多似乎函數指針只是把函數的調用弄得更復雜了而已,除了把函數當作參數來使用似乎沒有什麼作用了,真的是如此嗎?
如果我們仔細觀察,會發現函數指針將函數的調用和函數的實現分隔開來了,即函數指針提前規定好了函數的實現標準,這樣只要後來者按照這個標準來實現函數,可以不用修改前人的代碼,就能實現函數的完美的調用,這一作用在具體的項目迭代中是及其出衆的。