以下数据声明都代表什么含义:
float(**def)[10];
double*(*gh)[10];
double(*f[10])();
int*((*b)[10]);
long (*fun)int;
int (*(*f)(int, int))(int);
一道很小心的面试题,主要考了指针数组
、数组指针
以及函数指针
的概念。
一、数组指针
数组指针是一个指向数组的指针,用它代替数组进行操作,它的声明形式为:
1 2 |
int a[10]; int (*p)[10] = a; |
此时 p 就指向了数组 a,通过 p 就可以操作 a 数组。例如以下代码就会输出 2 3
:
1 2 3 4 |
int a[5] = {1, 2, 3, 4, 5}; int *p = a; cout << p[1] << endl; cout << *(p+2) << endl; |
二、指针数组
指针数组的本质是一个数组,它的每一个元素都是指针。它的声明形式为:
1 |
int* p[10]; |
因为 []
的优先级高于*
, 所以 p 先和 []
组合成数组,然后每一个元素都是 int*
类型。
1 2 3 4 5 6 7 8 |
int a[5] = {1, 2, 3, 4, 5}; int *p[5]; for (int i = 0; i < 5; i++){ p[i] = &a[i]; } for (int i = 0; i < 5; i++){ cout << p[i] << endl; } |
p 中的每个元素都是一个指向 int 类型元素的地址:
1 2 3 4 5 |
0x7ffd54d5dfb0 0x7ffd54d5dfb4 0x7ffd54d5dfb8 0x7ffd54d5dfbc 0x7ffd54d5dfc0 |
二、函数指针
函数指针是一个指向函数的指针,通过它间接操作函数,它的声明形式为:
1 |
bool (*pf)(const char*, const char*); |
例如
1 2 3 4 5 6 7 8 9 10 11 12 |
#include<iostream> using namespace std; bool compare(int a, int b){ return a > b ? a : b; } int main(){ bool (*pf)(int a, int b) = &compare; cout << pf(1, 2) << endl; return 0; } |
首先定义一个函数 compare
用作比较 a 和 b 的大小,然后定义一个函数指针 pf
指向 compare
函数。
使用 pf
即可完成比较功能,函数输出 1
即 true
。
四、解析
1. float(**def)[10]
def 是一个二维数组指针,它指向一个数组指针的地址。
2. double*(*gh)[10]
gh 是一个数组指针,它的每一个元素都是 double*
类型。
3. double(*f[10])()
f 是一个数组指针,它的每一个元素都是函数指针,指向一个没有参数并且返回值为 double 类型的函数。
4. int*((*b)[10])
等价于 int* (*b[10])
,即 b 是一个数组指针,元素类型为 int*
。
5. long(*fun)(int)
fun 是一个函数指针
6. int(*(*f)(int, int))(int)
f 是一个函数指针,形参为 (int, int)
,返回值也是一个函数指针,形参为 (int)
,返回一个 int
类型的元素。
评论