2

私は2D文字配列を持っています:私はこれらの要素の2つを(なしで)
char nm[MAX1][MAX2] = { "john", "bob", "david" };
交換したいのですが 、次のようになります。 std::swap
swapPointers(nm[0], nm[1]);
swapPointers

void swapPointers(char *&a, char *&b)  
{  
    char *temp = a;  
    a = b;  
    b = a;  
}

ただし、これはコンパイルされません(キャストを追加するとコンパイルされますが、ポインターが間違った/奇妙な場所を指していることになります)。

誰か助けてもらえますか?
ありがとう!

4

5 に答える 5

4

Zan は近いですが、彼の問題は、彼の 'swap' 関数が文字への任意のポインターを取ることができることです。これを誤用すると問題が発生する可能性があります。より安全なバージョンは次のとおりです。

void swap(char (&x)[MAX2], char (&y)[MAX2])
{
    char temp[MAX2];

    memcpy(temp, x, MAX2);
    memcpy(x, y, MAX2);
    memcpy(y, temp, MAX2);
}

ポスター側にも誤解があります。「nm」は文字の 2 次元配列です。ポインターはありません。nm[0]、nm[2] などもポインタではありません。これらは依然として (1 次元の) 配列です。1 次元配列が暗黙的にポインターに変換可能であるという事実は、多くの C および C++ プログラマーの間でこの種の混乱を引き起こします。

2 次元配列のデータをスワップするには、サイズ MAX2 のメモリ ブロックをスワップする必要があります。これは、Zan と私が書いた「スワップ」関数の両方で示されています。

于 2008-09-24T04:44:46.623 に答える
3

これらのポインターは 2 次元文字配列を指しているため、ポインターを再割り当てすることによってそれらのポインターを交換することはできません。

nm[a] と nm[b] はconst、nm が真にconstオブジェクトであるため、非常に強力です。そうでない場合は、名前を再割り当てすることで C 変数を RAM 内で移動できます。

大混乱を考えてみてください!だからあなたはそれをすることはできません。:-)

これらのポインターが指すものを交換するには、それらの配列の場所の値を交換する必要があります。

swap(char *a, char *b)
{
  char temp[MAX1];
  memcpy(temp, a, MAX1);
  memcpy(b, a, MAX1);
  memcpy(a, temp, MAX1);
}
于 2008-09-24T03:02:47.820 に答える
3

swapPointers()ポインタをスワップしますが、配列を渡そうとしています。

変えたら

char nm[MAX1][MAX2]

char *nm[MAX1]

の小さなバグを修正しますswapPointers()(最後の行は である必要がありますb = temp;)。動作します。

于 2008-09-24T03:25:47.127 に答える
1

本当のポイントは、C++ を使用している場合は、代わりに std::string の std::vector を使用する必要があることです。

std::vector<std::string> nm;
nm.push_back( "john" );
nm.push_back( "bob" );
nm.push_back( "david" );
std::swap( nm[0], nm[1] );

注: テストされていません。

于 2008-09-24T05:25:43.547 に答える
0
void swapPointers(char** ppa, char** ppb)
{
    char* ptemp = *ppa;
    *ppb = *ppa;
    *ppa = ptemp;
}

swapPointers(&nm[0], &nm[1]);
于 2008-09-24T02:37:52.140 に答える