int * array [32]は32の整数の配列へのポインタか、intへの32のポインタの配列ですか?それは問題ですか?
int *columns[32];
と書くと、int
に32個のポインタを持つ配列が定義されていますか?
それとも32 int
の配列へのポインタですか?
どのように2つを区別しますか?違いはありますか?
int * array [32]は32の整数の配列へのポインタか、intへの32のポインタの配列ですか?それは問題ですか?
int *columns[32];
と書くと、int
に32個のポインタを持つ配列が定義されていますか?
それとも32 int
の配列へのポインタですか?
どのように2つを区別しますか?違いはありますか?
疑問がある場合 - のコメントを受けて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でコンパイルするのは問題ではないはずです。
テストプログラムは、特に言語の弁護士でない者たちのものに、例示であり:
$ 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
$
ポインタの配列であるように思われます。
私は宣言の理解に「言語弁護士」の資格が必要だとはほとんど言いません。 – GManNickG
私は知っていますが、どちらがどちらかであることを決して覚えていない可能性があり、OS Xには素晴らしいバージョンの 'cdecl'がインストールされていません。 –
ほとんどの非弁護士は、 'cdecl'を使わずに宣言するか' void(*(* p)[N] [M])[O])(char c)= 0; 'geordi'や他の詐欺、私は思う。 –
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]);
を、私は少し明確な違いを作っ願っています。一方、後者は、次のようにあなたがして使用することができ、単一の初期化されていないポインタをインスタンス化します。
あなたはありがとう、ありがとうございます –
これは、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
です。ここで
私はC/C++ユーザーの多くではありませんが、言語は私に興味があります。おそらく私はC#の背景から来ていると思われます。 int(* columns)[32]を宣言している場合は、32個のポインタの配列が得られると思います。私は括弧の中の式がポインタ型を指定し、配列指定子が「左の型の32個のインスタンス」を意味するように、それを理解しています。従って - 32ポインタ。同じことが逆になります。もしあなたがint * columns [32]と言ってその大括弧がより厳密に束縛すれば、直感的なやり方は32個の項目の配列です。 –
これは逆の理由は何ですか?私はまた、他の場所、とりわけ関数ポインタにおいて括弧構文を見た。それは私にも意味がありません。それが意味をなされるように私はそれについてどのように考えるべきですか? –
K&Rはおそらく「理由」に答えるのに適しています。私はあなたの直感に同意します。 –
はあなたのためにいくつかの楽しい宣言です:多次元配列をより楽しくするために
int *arrayOfIntP[32];
int (*pointerToArrayOf32)[32];
これらの記事を見て:
1つのトリックから読むことです右から左に。
与えられたint * cols [32];
です配列内の要素だから私たちはそれをintへのポインタの配列として読んでいます(そして32を数える)。
別の答えにコメントに拡大: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は便利なツールですが、この練習を数回行われたいた後、あなたはそれを必要はありません。
私は本当にこの答えが好きです –
これは、私が "お気に入りの回答"機能を持っていたStackOverflowが欲しいところです。 : -/score + = 1; –
型は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上の元の記事は、もはや彼らのウェブサイト上で見つけることができません。
好奇心の高まりから、どこで 'cdecl'を入手するのですか? Appleの資本家のブタは、開発ツールを提供するのに親切ではなかった。 –
+1あなたは先にそのツールを見たことがありません。マニュアルページを参照してください... –
@Chris Mac OS Xにはcdeclは含まれていませんか?私はそれがすべてのUnixの標準ツールだと思っていました。任意のLinuxディストリビューションからcdeclソースを取得し、Mac OS Xでコンパイルすることができます.-それはどんな依存関係もありません。(まあ、おそらくreadline) – qrdl