5
以下はコードスニペットです。私はline no. 17
typecastingが有効で、適切であるかどうかを知りたいですか?私は配列へのポインタへのポインタのキャスト
void intermediate(twoInts b) {
print(&b);
}
に定義intermediate
を変更する場合
#include <stdio.h>
typedef int twoInts[2];
void print(twoInts *twoIntsPtr);
void intermediate (twoInts twoIntsAppearsByValue);
int main() {
twoInts a;
a[0] = 0;
a[1] = 1;
print(&a);
intermediate(a);
return 0;
}
void intermediate(twoInts b) {
print((int(*)[])b); // <<< line no. 17 <<<
}
void print(twoInts *c){
printf("%d\n%d\n", (*c)[0], (*c)[1]);
}
また、コンパイル時私は警告の下に取得していますし、O/pは適切ではありません。私の理解あたりとして
1.c:17:11: warning: passing argument 1 of print from incompatible pointer type
print(&b);
^
1.c:5:6: note: expected int (*)[2] but argument is of type int **
void print(twoInts *twoIntsPtr);
、配列は目的球引数にpointer to int
に減衰されます。正確な理由は何ですか?
'void print(twoInts * twoIntsPtr);'は と同じです。void print(int(* twoIntsPtr)[2]); 'つまり、配列を非表示にしないでください。 typedefの背後にあるポインタ。 – this
問題の最も適切な解決策は、実際にはtypedefの背後に配列を隠すことはないということです。次に、プログラムを忘却することを難読化する必要なしに、単純な 'int *'ポインタを使うことができます。 – Lundin
私は 'print((twoInts *)&b);'と言います。 – alk