0

関数内の整数の配列を操作したいのですが、アドレスプレフィックスとポインタプレフィックスのどちらを使用すべきかわかりません。

void shuffle(int *deck[]){  
    //statements
}

また

void shuffle(int &deck[]){  
    //statements
}

さらに、配列の値を直接操作したい場合、(関数内で)使用する必要があるかどうかわかりません

*deck[4] = 34

または、他の何か。

どんな説明でも大歓迎です。

4

6 に答える 6

3

Cには参照がないため(QにはCのみのタグが付けられています)、ポインターバージョンを使用する必要があります。

配列を関数に渡すと言うとき、基本的に関数に渡すのは最初の要素へのポインターです。次の2つの構文はどちらも、コンパイラーにとって同じことを意味します。

void shuffle(int *p_deck); 
void shuffle(int deck[]);
于 2012-09-04T04:18:30.820 に答える
0

Cには参照がありません(a)、それはC++です。

Cでは、配列は関数に渡されるときにXへのポインターに減衰するため、1つの方法は次のように使用することです。X[0]

void shuffle (int *pDeck) {
    // use pDeck[something]
}
:
int deck[] = {0,1,2,3,4,5,6,7,8,9};
shuffle (deck);

void shuffle (int pDeck[])前者は配列ではなくポインタを扱っていることを完全に明確にしているので、私は実際にはそのメソッドをバリアントよりも好みます。

これが重要である理由は、それを行うとサイズ情報が失われるためです。そのため、それも渡すことをお勧めします。

void shuffle (int *pDeck, size_t sz) {
    // use pDeck[0 thru sz-1]
}
:
int deck[] = {0,1,2,3,4,5,6,7,8,9};
shuffle (deck, sizeof (deck) / sizeof (*deck));

(a)非常に優れた機能ですが。ISOが次のC標準でそれらを検討することを願っています。なぜなら、この言語の初心者が抱える多くの問題がポインターに関係しており、参照によってその複雑さが非常によく隠される可能性があるからです。

于 2012-09-04T04:18:34.390 に答える
0

配列は関数に渡されるときにポインターに減衰するため、ここで追加レベルの間接参照を使用しても意味がありません。

C99標準の§6.3.2.1によると、

sizeof演算子または単項演算子のオペランドである場合、または配列を初期化するために使用される文字列リテラルである場合を除き、&「タイプの配列」タイプのは、「ポインタからタイプ」のタイプの式に変換されます。配列オブジェクトの初期要素であり、左辺値ではありません。配列オブジェクトにレジスタストレージクラスがある場合、動作は未定義です。

void shuffle(int deck[]) {
  ...
}

Cは参照をサポートせず、ポインタのみをサポートすることに注意してください。あなたはおそらくC++について考えているでしょう。

于 2012-09-04T04:19:03.283 に答える
0

ポインタバージョンを使用する必要がありますが、左右のルールがあるため、次のように信じています。

int * deck[]実際には、intの配列ではなく、intポインタの配列になります。

http://cseweb.ucsd.edu/~ricko/CSE131/rt_lt.rule.html

配列の最初の要素への参照を渡すだけです。

int * deckただし、範囲外にならないように、配列のサイズを渡すこともできます。

于 2012-09-04T04:21:49.297 に答える
0

ない。

配列は参照によってのみ渡すことができるため、トリックを行う必要はありません。ポインタを渡して逆参照するだけです。(とにかく、2番目の関数に&を含む構文は無効です)。それで:

void shuffle(int arr[])
{
    arr[0] = 1337;
}

また

void shuffle(int *arr)
{
}

など。そして、あなたはこのようにそれを渡すことができます:

int deck[52];
shuffle(deck);
于 2012-09-04T04:22:04.083 に答える
0

配列のサイズを指定すると、C++で参照によって配列を渡すことができます。

void shuffle(int (&deck)[52])
{
   deck[4] = 34;
}

サイズがわからない場合、またはCに制限されている場合は、ポインターを使用する必要があります。

もう1つの(C ++)オプションは、デッキにベクトルを使用し、代わりにベクトルへの参照を渡すことです。

于 2012-09-04T04:23:34.893 に答える