这个声明的含义是什么“int(* ptr [3])();”?

时间:2017-01-07 10:34:16

标签: c++ c syntax declaration

整个代码:

#include<stdio.h>    
 aaa(){ 
    printf("hi");  
 }  
 bbb(){  
    printf("hello");  
 }  
 ccc(){ 
    printf("ccc");  
 }  
int main(){  
     int(*ptr[3])(); 
     ptr[0]=aaa;  
     ptr[1]=bbb;  
     ptr[3]=ccc;   
     ptr[3]();   
}   

输出将是“再见” 从我看到代码int(*ptr[3])()是某种与int相关的数组声明,我看到它看起来像函数调用。 在较低行代码中,函数名称分配给数组,而数组可用于函数调用。 有人可以解释,声明是什么以及函数调用是如何进行的?

7 个答案:

答案 0 :(得分:6)

当您遇到这种类型时,您可以使用cdecl工具对其进行解码:

$ cdecl explain "int (*p[3])()"
declare p as array 3 of pointer to function returning int
$

请注意ptr是cdecl的保留字,您只需将变量重命名为更基本的...

------ ------ EDIT

确认一个空的参数列表在C或C ++中并不相同。在C中,这意味着具有未知数量的参数的函数(没有args的C函数必须声明为f(void))。在C ++中,这意味着没有参数的函数。

答案 1 :(得分:2)

它将ptr声明为3个int(*)()类型元素的数组,它是一个指向类型int()的指针,它是一个返回int的零参数函数

答案 2 :(得分:1)

int (*ptr[3])()是一个包含返回int的函数的3个指针的数组。

更清楚一点,这意味着它是一个函数指针数组。该数组有3个空间,预计函数将返回整数。

示例代码的其他一些问题

代码存在一些问题,所以我去了整理。

在数组中指定越界未定义的行为

test.c:30:3: warning: array index 3 is past the end of the array (which contains 3
elements) [-Warray-bounds]
ptr[3] = ccc;
^   ~
test.c:23:3: note: array 'ptr' declared here
int (*ptr[3])();

清理代码:

#include <stdio.h>

/* Missing function prototypes
 * For C a function taking no arguments should have void for its argument
 * For C++ void can be skipped
 */
int aaa(void);
int bbb(void);
int ccc(void);

/* The function should be declared with type specifier, although it is assumed
 * by default to return int.
 */
int aaa(void) {
  /* Unless this print statement is going to be part of more output, you should
   * return a newline
   */
  printf("hi\n");
  /* As this function is meant to return an int, we will return 0*/
  return 0;
}

int bbb(void) {
  printf("hello\n");
  return 0;
}

int ccc(void) {
  printf("ccc\n");
  return 0;
}

int main(void) {
  int (*ptr[3])();
  ptr[0] = aaa;
  ptr[1] = bbb;
  /* Now assigning to valid ptr[2] and not out of bounds ptr[3] */
  ptr[2] = ccc;
  ptr[2]();
}

答案 3 :(得分:0)

你读了boustrophedically:

您从最里面的部分开始,然后按照RIGHT-&gt; LEFT。

的方向开始阅读

所以这里:

int(*ptr[3])()

你转到最里面的标识符ptr,然后开始阅读:

...(*ptr[3])...

阵列3(指向......)

int(...)()

...没有原型(C89语义)和返回INT的功能。

答案 4 :(得分:0)

它只是意味着指向函数 3个指针数组,即aaa(),bbb()和ccc()。 :)

简单来说,一个包含3个函数指针的数组。

答案 5 :(得分:0)

我猜ptr[3] = ccc;这里错了..就像ABW一样 - 写出数组的界限。它应该是...... ptr[2] = ccc;

答案 6 :(得分:0)

该声明意味着有人没有想清楚。如果它被展开会更简单:

typedef int (*fptr)();
fptr ptr[3];