2013-03-28 4 views
0

EDIT: Хорошо, я думаю, что теперь я понимаю:запрашивающая разъяснение относительно типа отливать

Случай 1:

#include <stdio.h> 
#define function(_a) ((_a)*2) 

int main() { 
    int (*func)(int) = function(0); // function(0) = 0 
    func(7); 
... 
} 

синтаксис хорошо, однако, во время выполнения основной будет пытаться получить доступ адрес NULL, что приведет к сбою программного обеспечения в ошибке windows/segmentation в среде unix.

Случай 2:

#include <stdio.h> 
#define function(_a) ((_a)*2) 

int main() { 
    int (*func)(int) = function; 
    func(7); 
... 
} 

ошибка компиляции, так как «функции», на самом деле макрос, а не фактическая функция, для этого, указатель на функцию не может указать на него, так сказать.

Случай 3 (правильный код):

#include <stdio.h> 

    int function(int _a){return ((_a)*2);}; 

    int main() { 
     int (*func)(int) = function; 
     func(7); 
    ... 

} 

ли я получил это право на этот раз?

+1

это указатель на функцию, которая инициализируется 'NULL'. – Mysticial

+0

http://cdecl.org/ –

+0

в порядке, но что происходит при вызове функции, например 'func (7)'? – Caesar23

ответ

0

int (*func)(int) = 0; означает func является указатель функции т.е. pointer to a function и, следовательно, (*func) возвращение в операторе в integer т.е. первый int и который принимает integer в качестве аргумента т.е. (int). Присвоение int (*func)(int) на 0 означает, что указатель функции назначен на NULL.

+0

Спасибо за ответ, см. Мои комментарии к первому ответу :) – Caesar23

4

Эта линия не так, как вы думаете.

int (*func)(int) = 0; 

Это переменная (называется FUNC) на указатель на функцию, которая имеет подпись int somename(int) и вы устанавливаете его в 0.

Для лучшего понимания рассмотрим это:

int myfunction(int a) { return 5;} 

Тогда это будет работать

int (*func)(int) = myfunction; 
+1

Также стоит отметить, что после этой последней строки кода функцию можно вызвать с помощью функции 'func (10);' – torak

+0

@torak +1 для хорошей точки , –

+0

Я вижу! , Я совершенно ошибся! , фактически, исходный код был: 'int (* func) (int) = function (0);' и функция была определена следующим образом: '#define function (_a) ((_a) * 2)' – Caesar23

Смежные вопросы