函数指针的转换 & C的注意点

再让我们看看<signal.h>中声明的signal函数
void (*signal(int, void(*)(int)))(int)
首先,用typedef简化,
typedef void (*handler_type)(int)
得,void (*signal(int, handler_type))(int)
进一步 handler_type signal(int, handler_type);

记住:数组名是指向该数组首元素的指针
如,int a[11];  //那么a的类型为 (int *)
int *ptr;
ptr = a;
但是ptr = &a;是非法的,这里&a的类型为int (*)[],即指向数组的指针,大多数编译期对这种操作,或者视为非法,或者让其等于a

我们很容易知道calendar[4]表示什么含义:calendar[4]表示calendar数组的第5个元素,是12个有31个元素的数组之一。
sizeof(calendar[4])结果为31×sizeof(int)

此例中,calendar名字转换为一个指向数组的指针,其类型为int (*)[31]
于是p=calendar; 是非法的

int (*monthp)[31];
monthp = calendar;//OK

3.7 求值顺序
C中只有四个运算符(&&, ||, ? :和,)规定了求值顺序,对于其他运算符不要错误的假设求值顺序,他们求值顺序是未定义的。

如:
i = 0;
while(i < n)
    y[i] = x[i++];

这里y[i]的地址在i自增前被求值是没有任何保证的

http://www.cnblogs.com/chio/archive/2007/10/26/938064.html

时间: 2024-12-29 01:18:05

函数指针的转换 & C的注意点的相关文章

成员函数指针与高性能的C++委托

成员函数指针与高性能的C++委托(上篇) 撰文:Don Clugston 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(closure)"或"委托 (delegate)")在一些语言中已经证明了它宝贵的价值.在Delphi (Object Pascal)中,面向对象的函数指针是Borland可视化组建库(VCL,Visual Component Library)的基础.而在目前,C#使"委托&

C++ 函数指针

参考链接: http://hipercomer.blog.51cto.com/4415661/792300 C++ 静态函数指针的使用方法 demo 一  调用方法 void LoadingLayer::init() { //定义两个不同类型的函数指针类型 typedef ServerZoneLayer* (*subclass)(); typedef CCLayer* (*superclass)(); //创建一个函数指针 subclass subfun = &ServerZoneLayer::

由typedef和函数指针引起的危机

由typedef和函数指针引起的危机 昨天阅读了大神强哥的代码,发现里面用到了函数指针,也用到的typedef.本来我自以为对这两个概念有一定的认识,但是突然发现这两个东西居然用到了一起!!!!(在一起了也不说一声,一点心理准备都没有): typedef int (* fp)(void *para, void *end); 瞬间就蒙了,这是个啥东西???于是我开始看书,上网查资料,想弄明白.在这个过程中,我发现自己不仅仅是对这两个概念理解不够!!!而是,对数组.指针.变量的理解都不够.这引发了我

【C语言】函数指针与回调函数

在C语言中:指针是C语言的特色,有着各种各样的指针,普通的变量指针,常量指针,数组指针,指针数组,函数指针,指针函数.我们就讲一下函数指针与回调函数吧 首先关于函数指针,其实很简单. 对于一个函数指针来说,顾名思义,就是一个指向函数的指针,需要知道的是,对于指针而言,他总是存储一块地址,地址里面有着一个,一组,或者一块数据,在函数中,函数的存储是放在代码段的,每个函数都有着一个函数首地址,调用了这个地址相当于调用的这个函数. 具体的可以观看我的这篇博客,其中就通过在内存阶段改变栈帧返回值,成功的

对象布局已知时 C++ 对象指针的转换时地址调整

在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时,编译器会根据对象布局对相应的指针的值进行调整.不管是 microsoft 的编译器,还是 gcc 编译器都会做这个动作,因为这和 C++ 对象模型有关. 举一个简单的例子,如下代码: #include <stdio.h> class A { public: int x; void foo1()

C中函数指针的用法

理解了C中的声明和指针的话题后再来看函数指针的用法就很容易了. C中函数指针主要有两个用途: 1.作为参数传递给另外一个函数(即作为回调函数) 2.转换表(jump table) 下面分别来介绍作为回调函数的用法和作为转换表的用法 1.回调函数 在链表的查找中使查找函数与类型无关 /*在一个单链表中查找一个指定值的函数.它的参数是一个指向链表第一个节点的指针 * 一个指向我们需要查找的值的指针和一个函数指针,它所指向的函数用于比较存储于链表中的类型的值*/ #include <stdio.h>

C函数指针与回调函数

一.函数指针 简单声明一个函数指针并不意味着它马上就可以使用,和其它指针一样,对函数指针执行简接访问之前必须把它初始化为指向某一个函数. int f(int); int (*pf)(int)=&f; 第二个声明创建了函数指针pf,并把它初始化为指向函数f.函数指针的初始化也可以通过一条赋值语句完成.在函数指针的初始化之前具有f的原型是很重要的,否则编译器就无法检查f的类型是否与pf所指向的类型一致. 初始化表达式中的&操作符是可选的,因为函数名被使用时总是由编译器把它转换为函数指针.&am

【C/C++学院】0822-类型转换函数与构造转换函数/类的继承/类的继承以及区别/继承静态成员与静态函数//继承实现代码重用/单继承QT案例/多继承简介以及实战/Gpu编程

类型转换函数与构造转换函数 #include<iostream> class fushu { public: explicit fushu(int num)//避免隐式转换,引发歧义 { x = num; y = num; } void print() { std::cout << x << "+" << y << "i" << std::endl; } operator int(); //不支

指针数组、数组指针、函数指针、指针函数总结

指针数组 && 数组指针 char *a[5]; //定义一个指针数组, 数组的元素都是char *指针类型.初始化也可以在里面存放字符或字符串.a的类型是char *[5] //若char *a[5]={"red","white","blue","dark","green"}; //a在这里的类型是char *[],实质上是一个二级指针.也就是说a所代表的那块内存里面存放着的是数组中第一个