2009-09-03 14 views

答えて

16

疑問がある場合 - のコメントを受けてEDITcdecl

$> cdecl 
Type `help' or `?' for help 
cdecl> explain int *columns[32] 
declare columns as array 32 of pointer to int 

を尋ねる:私はGoogle Code SearchにCDECL源を発見しました。ライブラリにはGNU readlineが必要です。 Mac OS XやWindowsでコンパイルするのは問題ではないはずです。

+3

好奇心の高まりから、どこで 'cdecl'を入手するのですか? Appleの資本家のブタは、開発ツールを提供するのに親切ではなかった。 –

+0

+1あなたは先にそのツールを見たことがありません。マニュアルページを参照してください... –

+0

@Chris Mac OS Xにはcdeclは含まれていませんか?私はそれがすべてのUnixの標準ツールだと思っていました。任意のLinuxディストリビューションからcdeclソースを取得し、Mac OS Xでコンパイルすることができます.-それはどんな依存関係もありません。(まあ、おそらくreadline) – qrdl

0

テストプログラムは、特に言語の弁護士でない者たちのものに、例示であり:

$ gcc -x c - 
#include <stdio.h> 

int main(void) 
{ 
    int *columns[32]; 
    printf("%lu\n%lu\n", sizeof(columns), sizeof(columns[0])); 
    return 0; 
} 
$ ./a.out 
128 
4 
$ 

ポインタの配列であるように思われます。

+1

私は宣言の理解に「言語弁護士」の資格が必要だとはほとんど言いません。 – GManNickG

+0

私は知っていますが、どちらがどちらかであることを決して覚えていない可能性があり、OS Xには素晴らしいバージョンの 'cdecl'がインストールされていません。 –

+0

ほとんどの非弁護士は、 'cdecl'を使わずに宣言するか' void(*(* p)[N] [M])[O])(char c)= 0; 'geordi'や他の詐欺、私は思う。 –

7

32個のポインタの配列を定義しています。あなたは以前の宣言は32 *のはsizeof(int型)のためのスペースを持つ配列をインスタンス化し

int (*columns)[32]; 

をしなければならない32個のintの配列へのポインタを定義するには

int myintegers[32] = {0, 1, 2, ..., 31}; 
int (*columns)[32]; 

columns = &myintegers; 

printf("%d\n", (*columns)[2]); 

を、私は少し明確な違いを作っ願っています。一方、後者は、次のようにあなたがして使用することができ、単一の初期化されていないポインタをインスタンス化します。

+0

あなたはありがとう、ありがとうございます –

5

これは、intへの32個のポインタの配列です。はい、問題ありません。

Cの文法規則では、配列アクセス([])が逆参照(*)より厳密にバインドし、宣言がミラーの使用を指定しています。

宣言int *columns[32];は、式*columns[n]nは0〜31の数値)の表現がintであることを意味します。この式は*(columns[n])と同じです。宣言では32個のポインタのための領域が割り当てられますが、intは割り当てられておらず、(これが関数のローカル宣言であると仮定して)ポインタは初期化されません。

列32のintの配列へのポインタであったであろうよう*間接参照は、配列アクセスの前に起こることを意味し、宣言int (*columns)[32];次いで発現(*columns)[n]intされているだろうされてありました。宣言では1つのポインタが割り当てられていましたが、配列はintです。ここで

+0

私はC/C++ユーザーの多くではありませんが、言語は私に興味があります。おそらく私はC#の背景から来ていると思われます。 int(* columns)[32]を宣言している場合は、32個のポインタの配列が得られると思います。私は括弧の中の式がポインタ型を指定し、配列指定子が「左の型の32個のインスタンス」を意味するように、それを理解しています。従って - 32ポインタ。同じことが逆になります。もしあなたがint * columns [32]と言ってその大括弧がより厳密に束縛すれば、直感的なやり方は32個の項目の配列です。 –

+0

これは逆の理由は何ですか?私はまた、他の場所、とりわけ関数ポインタにおいて括弧構文を見た。それは私にも意味がありません。それが意味をなされるように私はそれについてどのように考えるべきですか? –

+0

K&Rはおそらく「理由」に答えるのに適しています。私はあなたの直感に同意します。 –

0

1つのトリックから読むことです右から左に。

与えられたint * cols [32];

  1. あなたはcolsの[32]を最初に参照してください。あなたはint型*を参照してください、これはサイズ32
  2. 次の配列である:これは、配列の左側そのすべてのタイプであるポインタ

です配列内の要素だから私たちはそれをintへのポインタの配列として読んでいます(そして32を数える)。

20

別の答えにコメントに拡大:C宣言を読み取るためのかなり簡単な手順があります

。宣言子の一番左の識別子から始めて、と()のバインドが*の前にあることを覚えておいてください。宣言

int *columns[32]; 

休憩それを下に宣言が

int (*columns)[32]; 

されていた場合、それは、これも役立ちます

 columns     -- columns 
    (*columns)    -- is a pointer 
    (*columns)[32]   -- to a 32-element array 
int (*columns)[32]   -- of int. 

として打破するでしょう

 columns     -- columns 
    columns[32]    -- is a 32-element array 
    *columns[32]    -- of pointers 
int *columns[32]    -- to int. 

として考えます複雑な宣言を構築する切除。あなたは文字の配列へのポインタを返す関数へのポインタの配列を宣言したいと仮定します。

  f      -- f 
      f[N]     -- is an N-element array 
     *f[N]     -- of pointers 
     (*f[N])()    -- to functions 
     *(*f[N])()    -- returning pointers 
     (*(*f[N])())[M]   -- to M-element arrays 
    *(*(*f[N])())[M]   -- of pointers 
char *(*(*f[N])())[M];   -- to char 

CDECLは便利なツールですが、この練習を数回行われたいた後、あなたはそれを必要はありません。

+1

私は本当にこの答えが好きです –

+1

これは、私が "お気に入りの回答"機能を持っていたStackOverflowが欲しいところです。 : -/score + = 1; –

0

型はint a)は


*ナイジェル・ジョーンズによってA 'C' Test: The 0x10 Best Questions for Would-be Embedded Programmersの#5に疑問を参照してください。 //整数整数

b)int * a; //整数へのポインタ

c)int ** a; //整数へのポインタへのポインタ

d)int a [10]; // 10個の整数の配列

e)int * a [10]; //整数への10個のポインタの配列

f)int(* a)[10]; // 10個の整数からなる配列へのポインタ

g)int(* a)(int); //整数引数をとり整数を返す関数へのポインタ

h)int(* a [10]); int整数の引数を取り、整数


を返す関数へのポインタ10の//配列*ああ、embedded.com上の元の記事は、もはや彼らのウェブサイト上で見つけることができません。