c语言的声明

来源:互联网 发布:数据库4大特性 编辑:程序博客网 时间:2024/04/29 19:34

在看APUE这本书上的signal函数的声明时感觉c语言声明太复杂,所以在此总结一下,看了几遍书还是觉得复杂。后来看一本书上介绍右左法则,虽然可以解决问题但我觉得按那样分析的话还是太慢了,可能是我理解的不够透彻吧。现在介绍一下我看c语言复杂声明的方法,感觉这样方便多了

记住常用的几个,复杂的声明就很容易理解了。

1.数组指针

int  (*p)[3]; 其实可以通过int a[3];来理解, 其中的ap差不多,a是指向数组的指针,所以类似的p也是指向数组的指针即数组指针,但区别是a是一个地址常量无法修改,而p是一个指针变量可以赋值。

 

2指针数组

int *p[3]; 因为[]的优先级要比高,所以可以通过加括号来看,(int *) p[3]这不就是一个数组,该数组的元素是一个指向int *类型的指针么!

 

3函数指针

int (*fp)(int);fp是一个函数指针,*fp就是该指针指向的函数,所以(*fp)()就是调用该函数的方式。但ANSIC标准允许简写为fp(),但是一定要记住这种写法只是一种简写形式。

还有一点就是,*fp两侧的括号非常重要,因为函数运算符()的优先级高于单目运算符*。所以如果*fp两侧没有括号,那么*fp()就是*(fp())的意思。

下面举两个例子以加深对函数指针及typedef的理解:

如果函数的指针是指向地址0,我们可以这样写么?(*0)(),显然是不行的,上例中的0必须进行类型转换,所以因该写为:(*   (void (*)() )  0 )(),但可以用typdef来表示的更加清晰: 

typedef void (*funptr)();

(*(funptr)0)();

 

在来看signal函数的原型 void (*signal(int,void(*)(int))) (int);

显然只要记住上面的3就知道 void*)(int)就是一个函数指针(singal函数处理信号的函数) 然后把signal函数不看就是void*)(int),这就是signal函数的返回值即指向信号处理函数的指针。

4.三个例子

下面来举几个例子,如果都能快速的解释出来就算基本过关了吧

int(* fun())();fun是一个函数指针,该函数的返回值也是一个函数指针(注意fan之间是没有括号的;

 

int (* foo())[];foo是一个函数指针,该函数的返回值是一个数组指针

 

int (* foo[])() foo是一个数组,该数组的元素是一个函数指针;

 

5.c语言中的声明格式

存储类型 类型限定符 数据类型 标志符

存储类型有auto staticregister

类型限定符有const

const int * a;

int const * a;

int * const a;

前两者表示指针所指的对象(*a)为只读,而后者表示指针(a)为只读。

数据类型:如float,double,int等。

· 

· 

 


0 0
原创粉丝点击