0

假设我们有一个func_ptr类型为 的函数指针void (*func_ptr)()。那么我们知道使用 this 我们可以使用 this 指针调用函数:

    (*func_ptr)();
    func_ptr();

但是再一次,假设我们有一个指向整数数组的指针int (*arr_ptr)[5],那么为什么我们不能将数组称为arr_ptr[],从而将其元素称为arr_ptr[0]等等arr_ptr[1]?为什么我们只能使用(*arr_ptr)[0]and (*arr_ptr)[1]

4

2 回答 2

2

的类型arr_ptr[0]int [5]; 的类型(*arr_ptr)[0]int。如果你愿意,你可以使用arr_ptr[0][0].

#include <stdio.h>

int main(void) {
  int (*arr_ptr)[5];
  int a[2][5] = {{1, 2, 3, 4, 5}, {11, 12, 13, 14, 15}};
  arr_ptr = a;
  printf("%d %d\n", (*arr_ptr)[2], arr_ptr[1][2]);
  return 0;
}

您可以在 ideone 看到“正在运行”的代码

可以以任何一种方式使用函数指针只是(不错的)语法糖。

于 2013-05-04T10:17:29.463 回答
0

根据 ISO/IEC 20116.3.2.1/4

A function designator is an expression that has function type. Except when 
it is the operand of the sizeof operator, the _Alignof operator,65) 
or the unary & operator, **a function designator with type
‘‘function returning type’’ is converted to an expression that has 
type ‘‘pointer to function returning type’’ ** .

再次6.7.6.3 Function declarators长篇大论。

现在这是什么意思?当我们用它的声明符调用一个函数时,它被转换为该类型的指针,所以两者都需要表示同一个函数。即 foo 和 &foo 是一样的。你怎么检查这个?我这样做的愚蠢方式是(请不要这样做)

int s(){return 100;}
int a = &s;
int a = s;

现在两者都给出相同的错误!

现在你的问题
“我们有一个指向整数数组的指针”这意味着它是类型的int (*)[],所以当我们想要访问第二个元素时,例如,我们需要(*ptr)[1]. //@1

相同的规则适用于函数指针,例如

 int (*p)(void)    //`p` pointer to function type  

现在假设我们是否可以拥有函数数组(我们不能)并且我们需要一个指向我们需要的这种类型数组的指针

--> `int ((*fp)[5])(void)`  //which is not possible but lets assumme we can,

然后我们需要访问第二个函数,例如 as (*fp)[1]。这类似于@1。

但正如标准所说

函数声明器被转换为指向该类型函数的指针,这意味着

如果我们有一个函数说

int foo()
{
    return 100;
}

我们可以通过以下方式调用这个函数

1) foo()
2) (&foo)()
3) (*foo)()

1)and 与相同2)3)因为 1) 被转换为3)(如标准),并且2)a 可能int (*fp)(void) = &foo与 int 相同(*fp)(void) = foo;

于 2013-05-04T11:33:53.057 回答