1. 程式人生 > >使用typedef分解複雜指標宣告技巧與具體例項

使用typedef分解複雜指標宣告技巧與具體例項

 


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