6

...typedefを使用せずに。

私の上司は、彼がかつてインタビューでこれを尋ねられたと主張し、彼が彼の答えを出したとき、インタビュアーは彼が貧弱なスタイルのためにtypedefを使うことができないと彼に言いました。

とにかく、彼は人々がそれを正しく理解できるかどうかを確認するために、通常は新しいプログラマーの昼食時に質問を投げかけるのが好きです。誰もそれを正しく理解することはできません(特にペンと紙またはコンピューターが手元にない場合)。次回彼が誰かを困らせようとするときの準備をしたい>:D

4

5 に答える 5

11

何へのポインタの 2D 配列?

T *p[N][M];     // N-element array of M-element array of pointer to T
T (*p[N][M])(); // N-element array of M-element array of pointer to 
                // function returning T

2D 配列へのポインターについて話している場合、物事は少しだけ興味深いものになります。

T a[N][M];            // N-element array of M-element array of T
T (*p)[M] = a;        // Pointer to M-element array of T
T (**p2)[M] = &p;     // Pointer to pointer to M-element array of T
T (*p3)[N][M] = &a;   // Pointer to N-element array of M-element 
                      // array of T
T (**p4)[N][M] = &p3; // Pointer to pointer to N-element array of 
                      // M-element array of T

編集:待ってください、私はあなたが求めているものを手に入れていると思います.

T *(*a[N])[M];        // a is an N-element array of pointer to M-element
                      // array of pointer to T

編集:今、私たちは本当にばかげています:

T *(*(*a)[N])[M];     // a is a pointer to an N-element array of 
                      // pointer to M-element array of pointer to T

T *(*(*(*f)())[N])[M];  // f is a pointer to a function returning
                        // a pointer to an N-element array of pointer
                        // to M-element array of pointer to T

T *(*(*f[N])())[M];     // f is an N-element array of pointer to 
                        // function returning pointer to M-element 
                        // array of pointer to T

そして、病理学的に正気でない人のために:

T *(*(*(*(*(*f)())[N])())[M])(); // f is a pointer to a function 
                                 // returning a pointer to a N-element
                                 // array of pointer to function 
                                 // returning M-element array of
                                 // pointer to function returning
                                 // pointer to T

Typedef は wusses 用です。

于 2009-07-16T15:24:11.090 に答える
8
void* array[m][n];

void ポインターの 2D 配列を提供します。あなたの質問を誤解していない限り、これについて何がそんなに混乱しているのかわかりません。

于 2009-07-16T08:25:26.213 に答える
2
void*** p2DArray = (void***)malloc( numAxis1 * sizeof( void** ) );

int count = 0;
while( count < numAxis1 )
{
    p2DArray[count] = (void**)malloc( numAxis2 * sizeof( void* ) );
    count++;
}

そして、そこに行きます。p2DArray[n][m] に移動して配列にアクセスし、そこに格納されている void* を取得できるようになりました。

とにかくtypedefを使用する必要がある理由がわかりません...

編集:ははははまたはavakarが提案したもの;)

于 2009-07-16T08:24:34.810 に答える
0

C/C++ では行優先、Matlab/Fortran では列優先、そして不明な理由で多次元配列との C#/ネイティブ相互運用。

int x = 4;
int y = 4;
void** data = malloc(x * y * sizeof(void*));
于 2009-07-16T08:27:35.693 に答える
0

typedef と関数ポインターの利点は、プログラマーの精神的負担を軽減することです。

問題はそこから来ていると思います.voidポインターを使用するとこれが解決しますが、すべての警告を取り除くために使用するたびにFPをキャストする必要があります。

于 2009-07-16T08:28:27.983 に答える