指针数组、数组指针、函数指针、指针函数总结C++
2014-11-12 08:42
501 查看
指针数组、数组指针、函数指针、指针函数总结2014-11-11指针数组 && 数组指针
?
从上面我们可以看到char (*)[]、 char [][]、char **其实可以看成是等价的
?
?
@1 定义指针数组,组中元素均为char *类型
@2 定义数组指针,ptr类型为char (*)[],m类型为char [][],这两类型间是可以赋值的。但他们不是完全等价的。
@3 a的类型为char*[5],sizeof(a)=sizeof(char *)*5; m的类型为char [][]的二维数组,sizeof(m)求得它在内存中实际所占字节,有些编译器出于效率考虑会对字节进行对齐。
运行结果如下
常见误区
?
//从结果中可以发现,不论什么类型的指针在内存中都是占四个字节的大小存放
函数指针 && 指针函数
函数指针和其它指针一样,对函数指针执行间接访问之前必须把它初始化为指向某个函数。
下面是一种初始化函数指针的方法:
int fun( int );
int ( * pf ) ( int ) = &fun;
创建函数指针pf并将其指向函数fun。在函数指针的初始化之前具有fun的原型是很重要的,否则编译器无法检查fun的类型与pf所指向的类型一致。
初始化声明后,我们可以有以下三种方式调用函数:
int ans;
1) ans = fun( 25 );
2) ans = ( *pf ) ( 25 );
3) ans = pf ( 25 );
语句1简单的使用名字调用函数fun。但它的执行过程可能跟你想的不一样:函数名fun首先被转换为一个函数指针,该指针指向内存中的一块位置。然后,函数调用操作符调用函数,执行开始于这个地址的代码。
语句2对pf执行间接访问操作,将pf转换为函数名。但这种转换其实是不必要的,编译器在执行函数调用操作符之前又会把它转换回去。
语句3和前两条执行效果一样的。
函数指针的常见用途就是把函数指针作为参数传递给函数,下面是例子。
?
运行结果:
使用以上技巧的函数被称为回调函数(callback function)。用户将一个函数指针作为参数传递给其它函数,后者将“回调”用户的函数。分别为比较整型与字符串编写不同的比较函数compar_int(void const *,void const *)和compar_char(void const *,void const *),通过向Compare(const void *,const void *,int (*compare)(void const *, void const *))传递不同的函数指针,通过同一接口实现对不同类型数据的比较。
指针函数,指针函数是指带指针的函数,即本质是一个函数。函数都有返回类型(如果没有返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。
?
?
@2 定义数组指针,ptr类型为char (*)[],m类型为char [][],这两类型间是可以赋值的。但他们不是完全等价的。
@3 a的类型为char*[5],sizeof(a)=sizeof(char *)*5; m的类型为char [][]的二维数组,sizeof(m)求得它在内存中实际所占字节,有些编译器出于效率考虑会对字节进行对齐。
运行结果如下
常见误区
?
函数指针 && 指针函数
函数指针和其它指针一样,对函数指针执行间接访问之前必须把它初始化为指向某个函数。
下面是一种初始化函数指针的方法:
int fun( int );
int ( * pf ) ( int ) = &fun;
创建函数指针pf并将其指向函数fun。在函数指针的初始化之前具有fun的原型是很重要的,否则编译器无法检查fun的类型与pf所指向的类型一致。
初始化声明后,我们可以有以下三种方式调用函数:
int ans;
1) ans = fun( 25 );
2) ans = ( *pf ) ( 25 );
3) ans = pf ( 25 );
语句1简单的使用名字调用函数fun。但它的执行过程可能跟你想的不一样:函数名fun首先被转换为一个函数指针,该指针指向内存中的一块位置。然后,函数调用操作符调用函数,执行开始于这个地址的代码。
语句2对pf执行间接访问操作,将pf转换为函数名。但这种转换其实是不必要的,编译器在执行函数调用操作符之前又会把它转换回去。
语句3和前两条执行效果一样的。
函数指针的常见用途就是把函数指针作为参数传递给函数,下面是例子。
?
使用以上技巧的函数被称为回调函数(callback function)。用户将一个函数指针作为参数传递给其它函数,后者将“回调”用户的函数。分别为比较整型与字符串编写不同的比较函数compar_int(void const *,void const *)和compar_char(void const *,void const *),通过向Compare(const void *,const void *,int (*compare)(void const *, void const *))传递不同的函数指针,通过同一接口实现对不同类型数据的比较。
指针函数,指针函数是指带指针的函数,即本质是一个函数。函数都有返回类型(如果没有返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。
相关文章推荐
- 指针数组、数组指针、函数指针、指针函数总结
- C++中的指针、数组指针与指针数组、函数指针与指针函数
- C++中的指针、数组指针与指针数组、函数指针与指针函数
- C++中的指针、数组指针与指针数组、函数指针与指针函数
- 指针, 指针的指针, 数组, 指针数组, 数组指针, 指针函数, 函数指针 C/C++中函数指针的含义
- 常量指针、指针常量、指针函数、函数指针、指针数组、数组指针区别在哪里?
- 数组指针,指针数组,函数指针,指针函数
- C/C++ 指针数组与数组指针、函数指针与指针函数、模板函数与函数模板、类模板与模板类区别
- 浅析指针数组、数组指针、函数指针、指针函数、函数指针数组的指针
- (指针常量,常量指针)-(函数指针,指针函数)-(指针数组,数组指针)
- 指针数组、数组指针、函数指针、指针函数总结
- C语言 复杂指针的申明问题 数组指针 指针数组 函数指针 指针函数一览无遗! C/C++求职面试必备考点(四)
- 数组和指针、数组指针和指针数组、函数指针和指针函数、数组标识符的意义、静态和动态创建的数组的本质区别、标识符类型判断方法
- 指针数组,数组指针,函数指针,指针函数,多级指针
- [C++基础]那些容易被混淆的概念:函数/数组指针-指针函数/数组,类/函数模板-模板类/函数
- 指针数组、数组指针、函数指针、指针函数总结
- C++ 数组指针 指针数组 以及 函数指针 指针函数
- C/C++中指针数组、数组指针、指针函数、函数指针的比较
- [C++基础]那些容易被混淆的概念:函数/数组指针-指针函数/数组,类/函数模板-模板类/函数