c的复杂声明

  这几天在看c程序设计语言第二版,在看到第五章复杂声明时,有些疑惑,在结合别人的理解上,我按自己的理解方式理解复杂声明,并附上实际的测试例子。

  1.首先选取的是      char  ( * ( * x ( ) ) [ ] ) ( ) ,由外至内分解,分解如下:

 a..选取左边的char ( * ,右边选取 ) ( ) ,合起来就成为 char ( * ) ( ) 。这表明这是一个函数指针,该函数零参数,返回 char。删除已选的字符,剩下

                              ( * x ( ) ) [ ]

  b.选取左边的( *,右边选取) [ ],合起来就成为  ( * ) [ ] 。这表明这是一个指针数组,数组存放的是上面的所得的函数指针。删除已选的字符,剩下

                               x ( )

  c.这里可以看出,实际x是一个函数,该函数返回上述所得的数组指针。

  实际上char  ( * ( * x ( ) ) [ ] ) ( ) 的含义,英文原版的说法是 x:function returning pointer to array[] of pointer to function returning char.我理解的意思是 函数X返回一个指针数组,该指针数组存放的是一组函数指针A,该函数A无参数和返回char。

  借用外国的测试代码

#include <stdio.h>

char x1() { return 'a'; } // Function returning a char
char (*x2[])() = {&x1}; // Array of pointers to functions returning char
char (*(*x())[])() { return &x2; } // Function returning a pointer to the above

void main()
{
    char (*x3)() = **x(); // Pointer to a function returning char
    printf("This is the value: %c\n", x3());
}

   2.接下来的是char ( * ( * x [ 3 ] ) ( ) ) [ 5 ],由外至内分解,分解如下:

   a.选取左边的char ( *,右边选取 ) [ 5 ] ,合起来就成为char ( * ) [ 5 ] ,这是一个数组指针,该数组指针指向char[5].删除已选的字符,剩下

                            ( * x [ 3 ] ) ( ) 

   b.选取左边的 ( *,右边选取 ) ( ) ,合起来就成为 ( *) ( ) 这是一个无参的函数指针,该函数返回的是一个上面所得的数组指针,删除已选的字符,剩下

                                x[3]

  c.这里可以看出x是一个有3个元素的数组,存放的元素为上面所得函数指针。

   实际上char ( * ( * x [ 3 ] ) ( ) ) [ 5 ]的含义,英文原版的说法是X:array[3] of pointer to function returning pointer to array[5] of char.我理解的意思是数组X[3]存放的是3个函数指针,该函数指针返回一个数组指针,该数组指针对应的是一组char[5]的数组。

   测试代码

#include <stdio.h>

char x1[][5]={"1234","abcd"};
char (*x2())[5]{return y1;}
char (*(*x[3])())[5]={x2};

int main(){
	char (*(*p1)())[5]=y[0];
	char *p2=(*p1)();
	printf("%s\n",p2);
}


 


所以,总结一条乱说的结论,左取一括加一星,右取一对加一括,连续数组不要紧,一次取完就稳妥。


   

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值