【C】C的typedef的妙用

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;
}

搞了那麼多似乎函數指針只是把函數的調用弄得更復雜了而已,除了把函數當作參數來使用似乎沒有什麼作用了,真的是如此嗎?

如果我們仔細觀察,會發現函數指針將函數的調用和函數的實現分隔開來了,即函數指針提前規定好了函數的實現標準,這樣只要後來者按照這個標準來實現函數,可以不用修改前人的代碼,就能實現函數的完美的調用,這一作用在具體的項目迭代中是及其出衆的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章