C语言复杂声明

 C专家编程》第三章介绍了如何分析复杂的声明,讲的非常不错。对于作者介绍的分析复杂声明的方法,我没有完全掌握,不过,我有我自己的一套方法来解析复杂的声明,正所谓条条大道通罗马,只要结果一样,必须在乎过程呢。今天在网上找了几个复杂的声明,练练手(声明的例子全部来自网络,原谅出处未详)。记下此文,作个标记,待日后回味。

int (*func)(int *p)

    这个就不解释了,每本C语言参考书上都会有的。作为一个C/C++程序员还不会的话,说明你已经out了~~_~~

int (*func)(int *p, int (*f)(int*))

    func是一个指针,指向一个函数,函数接收两个参数,第一个参数是int *,第二个参数是一个函数指针(该函数指针接收int *参数,返回int值),函数返回int值。使用typedef来简化一下:

  1. int (*func)(int *p, int (*f)(int*));  
  2. /* 等价于 */  
  3. typedef int (*functor1)(int *);  
  4. typedef int (*functor2)(int *, functor1);  
  5. functor2 func;  

int (*func[5])(int *p)

    func是一个包含5个元素的数组,数组中的每个元素是函数指针,函数接收int *参数,并返回int值。用typedef来简化一下:

  1. int (*func[5])(int *p);  
  2. /* 等价于 */  
  3. typedef (*functor)(int *);  
  4. functor func[5];  

int (*(*func)[5])(int *p))

    func是一个指针,指针指向包含5个元素的数组,数组是的每个元素是函数指针,该函数接收int *参数,并返回int值。用下面的代码来表示一下func是个什么东东:

  1. int (*(*func)[5])(int *p);  
  2. /* func是下面这个东东: */  
  3. typedef int (*functor)(int *);  
  4. functor arr[5];  
  5. func = &arr;  

int (*(*func)(int *p))[5]

    func是一个指针,指针指向函数,函数接收int *参数,返回指针,指针指向包含5个元素的int型数组。用typedef来简化一下:

  1. int (*(*func)(int *p))[5];  
  2. /* 等价于 */  
  3. typedef int arr[5];  
  4. typedef arr *(*functor)(int *);  
  5. functor func;  

int (*(*func)[5][6])[7][8]

    func是一个指针,指针指向行数为5, 列数为6的二维数组,数组中保存的是指针,指针指向行数为7,列数为8的int型数组。下面的代码也许会让你更清楚一点:

  1. int (*(*func)[5][6])[7][8];  
  2. /* see it: */  
  3. typedef int arr[7][8];  
  4. arr *func1[5][6];  
  5. func = &func1;  

int (*(*(*func)(int *))[5])(int *)

    func是一个函数指针,函数接收int *参数,返回一个指针,指针指向包括5个元素的数组,数组中的元素是函数指针,函数接收int *参数,返回int值。用typedef简化一下下:

  1. int (*(*(*func)(int *))[5])(int *);  
  2. /* 等价于 */  
  3. typedef int (*functor1)(int *);  
  4. typedef functor1 arr[5];  
  5. typedef arr *(*functor2)(int *);  
  6. functor2 func;  

int (*(*func[7][8][9])(int*))[5]

    func是一个三个数组,数组中的每个元素是指针,指针指向函数,函数指向int*参数,返回指几包含5个元素的int数组(嗷口),和typedef来简化一下:

  1. int (*(*func[7][8][9])(int*))[5];   
  2. /* 等价于 */  
  3. typedef int arr[5];  
  4. typedef arr *(*functor)(int *);  
  5. functor func[7][8][9];  

 

 i)int *p[3]; 
(ii)int (*q)[3]; 
(iii)int *(t[3]); 
以上三者的区别?(vc++环境下验证): 
(1)p是一个指针数组,此处包含三个整型指针,所以sizeof(p)=12;sizeof(*p)=4;//首地址 
    
(2)q是一个数组指针,指向含有三个元素的整型数组,所以sizeof(q)=4;sizeof(*q)=12; 

(3) 和(1)一样;sizeof(t)=12;sizeof(*t)=4; 

(4)   int *p[3]等价于:typedef        int*    myint; 
                                  myint  p[3]; 
                   int (*p)[3]等价于:typedef     int    intarray[3]; 
                                  intarray  *p; 
(5)   (i)可以这样初试化:int  a[]={1,2,3,4}; 
                 p[0]=a;//*p=a;  
      (ii)可以这样初始化:int  a[3]={1,2,3};//数组元素必须是三个 
                  q =&a; 
(6)p是数组,不可做++操作,q是指针,可以做++操作,q++是当前q指向的地址值加12;

摘自:http://my.oschina.net/kaixindewo/blog/16364

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值