面试题一道:

以下数据声明都代表什么含义:

float(**def)[10]; double*(*gh)[10]; double(*f[10])();

int*((*b)[10]); long (*fun)int; int (*(*f)(int, int))(int);

一道需要很小心的面试题,主要考了指针数组数组指针以及函数指针的概念。

一、数组指针

数组指针是一个指向数组的指针,用它代替数组进行操作,它的声明形式为:

int a[10];
int (*p)[10] = a;

此时p就指向了数组a,通过p就可以操作a数组。例如以下代码就会输出2 3

int a[5] = {1, 2, 3, 4, 5};
int *p = a;
cout << p[1] << endl;
cout << *(p+2) << endl;

二、指针数组

指针数组的本质是一个数组,它的每一个元素都是指针。它的声明形式为:

int* p[10];

因为[]的优先级高于*, 所以p先和[]组合成数组,然后每一个元素都是int*类型。

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类型元素的地址:

0x7ffd54d5dfb0
0x7ffd54d5dfb4
0x7ffd54d5dfb8
0x7ffd54d5dfbc
0x7ffd54d5dfc0

二、函数指针

函数指针是一个指向函数的指针,通过它间接操作函数,它的声明形式为:

bool (*pf)(const char*, const char*);

例如

#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即可完成比较功能,函数输出1true

四、解析

  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是一个函数指针,形参为一个int类型元素,返回long。
  6. int (*(*f)(int, int))(int):f是一个函数指针,形参为(int, int),返回值也是一个函数指针,形参为(int),返回一个int类型的元素。

额外添加的:

  • int(*s[10])(int): 函数指针数组,S[10]里面每个元素都是函数指针,指向函数的类型是int fun(int a)
最后修改:2019 年 12 月 29 日
如果觉得我的文章对你有用,请随意赞赏