2

私が分析しているいくつかのコードで、次のコード行を見つけました。

Mintau = (double*) malloc(FadeAll.num_paths*sizeof(double));

また、次のようなポインターのさまざまな構文を説明する質問をここで見つけました (これは、表示される他の質問の複製でした)。

int *ptr;  
int * ptr;  
int* ptr; 

上記の3つすべてが同じことを言っていることを完全に理解していることを説明する必要があります. 最後の 1 つは、私のコード行に最もよく似ているものです。私が疑問に思っていたのは、この場合に double を括弧で囲む必要があるのはなぜですか? これが重複した質問である場合は申し訳ありませんが、これに関するものは見つかりませんでした。

4

5 に答える 5

5

この 3 つの宣言に違いはありません。

int *ptr;  
int * ptr;  
int* ptr; 

(double*)キャストであるため、括弧で囲む必要があります。

このリンクでキャストについて少し読んでください

それが役に立てば幸い。

于 2012-06-18T14:26:05.933 に答える
4

それはキャストを意味します。関数mallocは を返しますvoid*。その(double*)値を型にキャストしますdouble*

C では、すべてのポインタ型が と互換性のある代入であるため、このキャストは不要void*です。しかし、これが C++ の場合、キャストが必要になります。

以下の間に違いはありません。

int *ptr;  
int * ptr;  
int* ptr; 
于 2012-06-18T14:25:44.517 に答える
2

キャスト(double*)です。_ type-name expressionという形式の式を見ると、それは「式の結果を型type-nameの値として解釈する」ことを意味します。この場合、「の結果をポインタとして解釈する」と言っています。 () mallocdouble

通常、ある型 ( など) のポインター値をchar *別の型 ( など) のポインター変数に直接代入することはできないdouble *ため、キャスト式を使用してソース値をターゲット型に明示的に変換する必要があります。1989 年の標準より前は、malloccalloc、およびreallocすべての戻りchar *値であるため、キャストを使用して結果を別のポインター型に割り当てる必要がありました。

このvoid *型は、1989 年の標準で、キャストを必要とせずにさまざまなポインター型に割り当てることができる*alloc汎用ポインター型として導入され、関数はその型の値を返すように変更されました。の結果を明示的にキャストすることは、malloc現在では悪い習慣と見なされています。

キャスト式の型の構造は、宣言されているものの名​​前がないだけで、宣言の型の構造とほぼ一致します。これは、いくつかの例で説明するのがおそらく最も適切です。

int *ppへのポインターとして宣言しintます。式の結果を へのポインタにキャストするにはint、 と書き(int *)ます。これは、宣言から identifier を除いたものと同じpです。

次にいくつかの例を示します。

宣言キャストタイプ
----------- ---- ----
int (*ap)[10] (int (*)[10]) intの10要素配列へのポインタ
int (*f)(void) (int (*)(void)) int を返す関数へのポインタ
char **p (char **) charへのポインタへのポインタ

繰り返しますが、キャスト式の構造は宣言の構造と同じですが、宣言されているものの名​​前を除いています。

于 2012-06-18T18:24:23.280 に答える
2

これは、malloc()の戻り値の型 ( void *) から へのキャストであることを意味しfloat *ます。キャストとは?http://en.wikipedia.org/wiki/Type_conversion#Explicit_type_conversion

ところで、 の戻り値をキャストするのは非常に悪い習慣ですmalloc()。理由を見る: malloc の結果をキャストしますか?

于 2012-06-18T14:29:23.413 に答える
1

それはキャストであるため、括弧で囲まれています。これは、基本的にコンパイラに、このメモリの一部をこのタイプを持つものとして扱います。ペアの不一致)。

mallocC では、 からのキャストvoid *は自動であるため、 の結果をキャストするのも悪い形式と見なされます。コードノイズを追加するだけで、何のメリットもありません。

3 種類の変数宣言については、 とint* a, b;は大きく異なることに注意してint *a, *bください。型ではなく、変数名にバインドされているポインターを明示的に示しているため、私は後者を好みます。

于 2012-06-18T14:28:14.393 に答える