使用typedef分解複雜指標宣告技巧與具體例項
阿新 • • 發佈:2018-11-05
int * ( * ( * (*abc)() ) [6] ) ( )
解讀:解讀順序,紅->橙->綠->黑
1.紅色部分為 函式指標
2.橙色部分為 陣列指標
3.綠色部分為 函式指標
4.黑色部分為 返回型別為int*型
綜合:指向《返回值為“ 指向 ‘返回值為int型指標的函式指標’ 的陣列指標 ”》型別 的函式指標
#include <stdio.h> typedef int *(*(*(*abc)())[6])(); typedef int* (*p)();//從最裡面的型別開始,也就是黑色與綠色 typedef p (*pt)[6];//接著分解橙色 typedef pt (*ppt)();//最後分解紅色 int* func() { int a = 88; int *point; point = &a; return point; } pt func_2() { p arry[6] = { &func }; pt point_arry = &arry; return point_arry; } void main() { ppt point; point = func_2; printf( "%d\n", *(**point())() );//結果為88 abc test; test = func_2; printf( "%d\n", *(**test())() );//結果也是88,說明使用typede分解正確 getchar(); }
int (* (*abc)() )[6]
解讀:解讀順序,紅->橙->黑
1.紅色部分為 函式指標
2.橙色部分為 陣列指標
3.黑色部分為 返回型別為int型
綜合:指向《 返回值為int型陣列指標 》型別 的函式指標
#include <stdio.h> typedef int (*p)[6];//先是黑色與橙色 typedef p (*pt)();//紅色 typedef int (*(*abc)())[6]; p func() { int arry[2][6] = { { 1, 2, 3, 4, 5, 6 },{ 7, 8, 9, 10, 11, 12 }}; p point; point = arry; return arry; } void main() { pt point_func; abc point_func_2; point_func = func; point_func_2 = func; printf( "%d\n", **point_func() ); printf( "%d\n", **point_func_2() );//證明pt和abc的型別正確 // printf( "%d\n", **(func() + 1 )); getchar(); }
int (** (*abc)() )();
解讀:解讀順序,紅->橙->黑
1.紅色部分為 函式指標
2.橙色部分為 指向函式指標的指標
3.黑色部分為 返回型別為int型
綜合:指向《 返回值為int型 指向函式指標的指標 》型別 的函式指標
#include <stdio.h> /*typedef int (**(*abc)())(); typedef int (**p)();//int的函式指標的指標 typedef p (*ppt)(); abc 的型別與 ppt的型別相同 */ typedef int (*p)(); typedef int (**pt)();//分解橙色與黑色部分 typedef pt (*ppt)();//分解紅色部分 int max() { int a = 32; return a; } pt func() { p point_max;//函式指標 pt p_p_max;//指向函式指標的指標 point_max = &max; p_p_max = &point_max; return p_p_max; } void main() { ppt k;//指向的函式具有“ 返回值為int的函式指標的指標” k = &func; printf( "%d\n", (**((*k)()))() );//“(*k)()”==>func(),(**((*k)()))() )==>max() getchar(); }
int *( *abc ) [6]
解讀:解讀順序,紅->橙->黑
1.紅色部分為 指標
2.橙色部分為 指標陣列
3.黑色部分為 型別為int型
綜合:指向《 int型 指標陣列 》型別 的指標
#include <stdio.h>
typedef int *p[6];//分解黑色與橙色
typedef p *pt; //分解紅色
typedef int *(*abc)[6];
void main()
{
int a = 88;
int *k = &a;
p point_arry = { k };
pt point = &point_arry;
printf( "%d\n", ***point );
abc test = &point_arry;
printf( "%d\n", ***test );
getchar();
}
int * (* abc() )()
解讀:解讀順序,紅->橙->黑
1.紅色部分為 函式
2.橙色部分為 函式指標
3.黑色部分為 型別為in*t型
綜合:返回 《 int*型的函式指標 》的函式
#include <stdio.h>
typedef int *(*p)();//返回值為int型指標的函式指標
int* mm()
{
int *p ;
int a = 88;
p = &a;
return p;
}
int *(*abc())()//返回值為“返回值為int型指標的函式指標”
{
p a;
a = &mm;
return a;
}
void main()
{
printf( "%d\n", *((*abc())()) );//(*abc())得到mm的地址,((*abc())())等價於mm(),*((*abc())())取到mm()這個地址裡面的值
getchar();
}
int **( *abc[6] )()
解讀:解讀順序,紅->橙->黑
1.紅色部分為 指標陣列
2.橙色部分為 指向函式指標的指標
3.黑色部分為 型別為int型
綜合:指向 《 int型指向函式指標的指標 》的指標陣列
#include <stdio.h>
typedef int** p();//先分解橙色與黑色
typedef p ( *test[6] );//分解紅色
typedef int **( * abc[6] )();
int **func()
{
int a = 88;
int *p = &a;
int **ppt = &p;
return ppt;
}
void main()
{
test a;
a[0] = func;
// printf( "%d\n", **func());
printf( "%d\n", **(a[0]()));
getchar();
}