初始化C语言中的复杂声明

发布时间 2024-01-11 16:10:19作者: 自由小菜园

int *( *( *arr[5])())(); 

float ( * ( *b()) [] )(); 

void * ( *c) ( char, int (*)()); 

void ** (*d) (int &, char **(*)(char *, char **));

float ( * ( * e[10]) (int &) ) [5];

上一篇我们分析过这些声明表示什么意思,今天我们初始化下这些声明

int *( *( *arr[5])())();  

1、看下最外面一层是一个函数,没有参数,函数返回一个int*类型的指针

int a=1;
int* f1(){
  return &a;
}
2、往里面看还是一个函数,返回一个指针,指向外面的函数
 int *(*f2())(){
  return &f1;
 }
3、再往里看是是一个数组,每一个元素都是指针,指向外面的函数
int *( *( *arr[5])())() = {&f2};

 

float ( * ( *b()) [] )();  

1、看最外面是一个返回float的函数
float f1(){
  return 1;
}

2、再往里面看是一个指针数组,其中的每个指针指向外面的函数

float  (*arr[])()={&f1}

3、再往里面看是一个函数,函数返回一个指针,指向外面的数组
float ( * ( *b()) [] )(){
  return &arr;
}

 

void * ( *c) ( char, int (*)());  

1、看最外面是一个函数,函数返回一个void *类型,函数有两个参数

void * f(char p1,int (*p2)()){
  reurn (void*)1;
}

2、看里面是一个指针,指向外面的函数
void * ( *c) ( char, int (*)())=&f;

 

void ** (*d) (int &, char **(*)(char *, char **));

1、看最外面是一个函数,函数有连个参数,函数返回的是一个void **类型的数据
void* a=(void*)1;

void ** f1(int &, char **(*)(char *, char **)){
     return &a;
 }
2、里面是一个指针,指向外面的函数
void ** (*d) (int &, char **(*)(char *, char **)) = &f1;

 

float ( * ( * e[10]) (int &) ) [5];

1、看最外面是一个数组,数组的没一个元素都是float类型

float arr[5]={1};

2、里面看是一个函数,该函数返回一个指针,指针指向外面的数组
float (*f1(int &))[5]{
 return &arr;
}

3、再往里面看是一个数组,数组的每一个元素是指针,指针指向外面的函数
float ( * ( * e[10]) (int &) ) [5] ={&f1};