整个代码:
#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相关的数组声明,我看到它看起来像函数调用。
在较低行代码中,函数名称分配给数组,而数组可用于函数调用。
有人可以解释,声明是什么以及函数调用是如何进行的?
答案 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];