2017-01-07 3 views
1

Всего код:Что означает это объявление: «int (* ptr [3])();»?

#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

Обратите внимание, что выходной * возможно * от '«до свидания»', но это зависит от того, довольно много вещей, в первую очередь это missuses * неопределенное поведение * (индексирует массив выходит за пределы). –

+0

Таким образом, это может привести к ошибке, если между «не привязанной» позицией будет записан какой-либо другой процесс. – lifeisshubh

+1

@Someprogrammerdude: "* output может быть by by' "bye" '*« Я бы сказал, что вероятность того, что код OP печатает «bye», очень, очень, очень и очень низкая, чтобы не сказать 0. – alk

ответ

5

Когда вы столкнулись с таким типом, вы можете затем использовать инструмент cdecl расшифровать его:

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

берегись, ptr зарезервированного слово Cdecl, вы просто должны переименовать переменное нечто большее, основной ...

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

Becareful, что пустой список аргументов не означает, что то же самое в C или C++. В C это означает функцию с неизвестным числом аргументов (функция C без args должна быть объявлена ​​как f(void)). В C++ это означает функцию без аргументов.

2

Он объявляет ptr как массив из 3-х элементов типа int(*)(), который является указателем на тип int(), который является функцией нулевого аргумента, который возвращает int.

+0

Итак, в основном 'int' - это возвращаемый тип функции функции zero-arg? – lifeisshubh

+0

@lifeisshubh Да. – emlai

0

Читаешь его boustrophedonically:

Вы начинаете с внутренней стороны и начать читать в направлении правшей> ЛЕВЫЙ.

Так вот:

int(*ptr[3])() 

Идет идентификатор ptr, который является внутренней частью, то вы начнете читать так:

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

ARRAY OF 3 (СТРЕЛКИ TO ...)

int(...)() 

... ФУНКЦИИ, КОТОРЫЕ НЕ ИМЕЮТ ПРОТОТИП (семантика C89) И ВОЗВРАТ INT.

0

Это просто означает массив указателей 3 указывая на функций, а именно ааа(), БББ() и ссс(). :)

В более простом смысле, массив указателей на функции 3 ..

1

int (*ptr[3])() является массив из 3 указателей на функции, возвращающие Int.

Чуть более ясно, это означает, что это массив указателей функций. Массив имеет пространство для 3 из них, и ожидается, что функции возвратят ints.


Некоторые другие вопросы с примерами кода

Были несколько вопросов, с кодом, так что я пошел и прибрала его.

Назначение вне границ в массиве не определено поведение.

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](); 
} 
0

Я думаю ptr[3] = ccc; здесь не так .. это как ABW - выписывая связанный массив. Это должно быть ... ptr[2] = ccc;

0

Это заявление означает, что кто-то явно не думал. Было бы намного проще, если бы он был раскатали:

typedef int (*fptr)(); 
fptr ptr[3]; 
Смежные вопросы