1

RELIC ライブラリ (ドキュメントはこちらhttps://code.google.com/p/relic-toolkit/downloads/list )でそのように定義された型 (fb_t) を確認します。

#if ALLOC == AUTO
typedef align dig_t fb_t[FB_DIGS + PADDING(FB_BYTES)/(FB_DIGIT / 8)];
#else
typedef dig_t *fb_t;
#endif

(重要な場合alignは として定義されます)/* empty */

つまり、ポインタまたは配列です。しかし、配列の場合、この関数はどのように機能するのでしょうか? (からrelic-doc/html/df/d96/relic__fb__util_8c_source.html#l00080)

void fb_copy(fb_t c, const fb_t a) {
    for (int i = 0; i < FB_DIGS; i++) {
        c[i] = a[i];
    }
}

そして、それがポインターの場合、このコードはどのように機能しますか (それらは初期化されていないポインターであるため)?

//create two variables 
fb_t source, target;
fb_copy(target,source); //and copy one to the other

どちらも同じコンピューターから実行されます。このsizeof(fb_t)コンピュータの は 16 です。

4

2 に答える 2

2

上記の関数は、配列またはポインターにfb_copy関係なく正しく機能します。fb_tこれは、配列とポインターが同等であるためです。

これを考慮してください(コメントを読んでください):

    int a[10];
    int *ip;

    ip = a; 
    // this assignment is as if you have written ip = &a[0]
    // the first facet of equivalence

[i]2 つ目は、ポインターを使用して配列要素にアクセスする構文を使用できることです。

     int a = ip[3]
     //it is just as if you had written *(ip + 3)

同等とは、ポインターと配列は異なりますが、ポインター演算と配列のインデックス付けは同等であり、結び付けられていることを意味します。

したがって、あなたが指摘したこの場合、その関数が初期化されたポインターを渡された場合、それは同等のことを行います*(c+i) = *(a+i)

于 2013-12-22T07:49:16.090 に答える