设为首页 加入收藏

TOP

C语言指针总结(二)
2014-11-23 21:34:02 来源: 作者: 【 】 浏览:20
Tags:语言 指针 总结
针pfun,把pfun作为函数的形参。把指针表达式作为实参,从而实现了对函数fun的调用。

在这里不得不说,C里面的回调函数。

回调函数:就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,

我们就说这是回调函数。

使用回调函数原因:

可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被

调用函数。

举例:

typedef int (*Fun)(char *p); // 为回调函数命名,类型命名为Fun,参数为char *p

int Afun(void *p)
{    // 方法 Afun,格式符合Fun 的格式
    printf("CallBack:%s!\n", (char*)p);
    return 0;
}

void call(char *p, int (*f)(void *))
{
    f(p);//回调
}
int main()
{
    call("123", Afun);
    return 0;
}

8. 指针类型转换

当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式,这就要求两边的类型一致,所指向的类型也一致,

如果不一致的话,需要进行强制类型转换。语法格式是:(TYPE *)p;

这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE *,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。要注意的是,原来的指针

p的一切属性都没有被修改。另外,一个函数如果使用了指针作为形参,那么在函数调用语句的实参和形参的结合过程中,也必须保证类型一致,否则需要强

制转换。

9.指针应用

int (*a)[10] 和 int *a[10] 什么区别

int *a[10] :数组指针。数组a里存放的是10个int型指针

int (*a)[10] :a是指针,指向一个数组。此数组有10个int型元素


int *a[10]

先找到声明符a,然后向右看,有[]说明a是个数组,再向左看,是int *,说明数组中的每个元素是int *。所以这是一个存放int指针的数组。

int(*a)[10]

先找到声明符a,被括号括着,先看括号内的(优先级高),然后向右看,没有,向左看,是*,说明a是个指针,什么指针?在看括号外面的,先向右看,有[] 是个数组,

说明a是个指向数组的指针,再向左看,是int,说明数组的每个元素是int。所以,这是一个指向存放int的数组的指针。

例:

int   *a[10];
int   (*b)[10];

printf("*a[10]:   %d\n ",   sizeof(a));
printf("(*b)[10]:   %d\n ",   sizeof(b));

结果是:

*a[10]: 40 //说明a是一个数组名

(*b)[10]: 4 //说明b是一个指针

10.右左法:应用分析指针的复杂申明

上面第9 说明了指针的简单应用,下面介绍复杂的应用。

右左法则:

“The right-left rule:Start reading the declaration from the innermost parentheses, go right, andthen go left. When you encounter parentheses, the direction

should be reversed.Once everything in the parentheses has been parsed, jump out of it. Continue tillthe whole declaration has been parsed.”

翻译后为:

首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过

程直到整个声明解析完毕。

对于这句话应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有

一个。

如:

Int (*f)(int n)

确定括号的含义是分析这个声明的重要步骤,这个声明有两个括号,每个括号作用不同。

首先找到未定义的标识符f,它向右是括号,然后向左,是 *, 即 f是个指针。然后向右为(int n), 这个括号为函数调用操作符。所以f是个指向函数的指针,然后再向左,

碰到int 即为“这个函数的返回类型为整型”,把上面的解析连起来即 f为一个包含参数int n的函数指针,它所指向的函数返回一个整型值。

int (*f[5])(int*p);

f右边是一个[]运算符,说明f是一个具有5个元素的数组,f的左边有一个*,说明f的元素是指针,要注意这里的*不是修饰 f的,而是修饰f[5]的,原因是[]运算符优先级比*高,

f先跟[]结合,因此*修饰的是f[5]。跳出这个括号,看右边,也是一对圆括号,说明f数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。

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

func被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明

这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函

数指针,这些指针指向具有int*形参,返回值为int类型的函数。


参考:

http://harborwan.blog.sohu.com/19248423.html

http://blog.csdn.net/megaboy/article/details/482771

< >


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇红黑树-C语言实现 下一篇c 16进制 字符串 加一 c 16进制 ..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: