2017-01-07 19 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

したがって、 "out of bound"の位置が他のプロセスによって書き込まれる場合にも、エラーが発生する可能性があります。 – lifeisshubh

+1

@Someprogrammerdude: "* 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ための予約語であることに注意してください、あなただけのより多くの何かに変数の名前を変更する必要があります引数の空のリストは、CまたはC++で同じことを意味しないことを基本的な...

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

Becareful。 Cでは、未知数の引数を持つ関数を指します(argsのないC関数はf(void)と宣言しなければなりません)。 C++では、引数のない関数を意味します。

2

それはintを返すゼロ引数関数であるint()を、型へのポインタであるタイプint(*)()の3つの要素の配列としてptrを宣言する。

+0

したがって、基本的に 'int'は関数のゼロ引数関数の戻り値の型ですか? – lifeisshubh

+0

@lifeisshubhはい。 – emlai

0

あなたはboustrophedonicallyそれを読む:

あなたが最も内側の部分から開始し、方向右>左に読み始めます。だからここ

:3(ポインタへの...)の

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

ARRAYを:

int(*ptr[3])() 

あなたが最も内側の一部である識別子ptrに行き、その後、あなたはとても読み始めます

int(...)() 

...プロトタイプを持たない関数(C89のセマンティクス)とリターンINT。

0

単に機能即ちAAA()、BBB()とCCC()を指すポインタ3の配列を意味します。単純な意味で:)

、3つの関数ポインタの配列..

1

int (*ptr[3])()は整数を返す関数へのポインタ3の配列です。

もう少し明確に、それは関数ポインタの配列であることを意味します。配列には3つのスペースがあり、関数はintを返すと予想されます。


のコード例

といくつかの他の問題のコードを持ついくつかの問題は、私が行って、それを片付けありました。

配列内の範囲外の割り当ては、の未定義の動作です。コードのクリーンアップ

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

を私はそれがABWようなものだ... ptr[3] = ccc;がここに間違っていると思います - 配列の境界外に書き込み。それは... ptr[2] = ccc;

0

その宣言は、誰かが明確に考えていなかったことを意味します。 「BYE」 `で*出力は*可能性があることを

typedef int (*fptr)(); 
fptr ptr[3]; 
関連する問題