2

重複の可能性:
C で関数の引数として多次元配列を渡す

一般的なスワップ機能を使用しようとしています:

void swap(void **p, void **q){
    void *tmp;
    tmp=*p;
    *p=*q;
    *q=tmp;
}


int main(){
    int M=5;
    int N=6;
    char*w[M][N];

    swap(&w[1][2], &w[2][2]);

    return 0;
    }

w はすでに値で初期化されていると仮定しましょう。引数を送信する方法についてのみ疑問に思っています

この場合、スワップに引数を送信する方法を理解しようとしています。

N=M=2 と仮定しましょう。だから私は{{"stack", "overflow"},{"best", "site"}}のようにwを持っています

  1. swap(w[i][j],w[k][r])は正しいオプションではありません。w[i][j] は実際の文字列への参照であり、swap は w[i] のみが **void を取得するためです。 [j] は *char のみへのポインタなので、
  2. swap(&w[i][j], &w[k][r])は適切なオプションのようです。char* へのポインターなので、互換性のないポインター型からスワップの引数を渡します。どうしてですか?
4

3 に答える 3

3

に変換することはできますがchar *(void *特殊なケースと考えてください)、 に変換char **void **て結果に対して意味のあることを行うことはできません。

同じ理由で、 に変換することはできますが、 に変換intして、コンパイラが文句を言わないことを期待shortすることはできません。int *short *

(たまたま一般的なアーキテクチャで動作しますが、C 標準では、2 つの異なるポインター型が同じ表現を持つことを保証するものは何もありませんが、いくつかの例外があります。)

void swap(char **p, char **q)
{
    char *tmp;
    tmp = *p;
    *p = *q;
    *q = tmp;
}
于 2012-07-19T20:32:11.740 に答える
2

コードの書き方に応じて、またはにキャストvoid**する必要があります。char*char*void**

C は、関数が処理しているデータの型を知らない一般的な方法をサポートしているとは思いません。

スワップ関数を記述する典型的な方法は、それを使用すると予想されるデータ型ごとであるため、ポインターを使用する代わりに、、、int*などを交換するための個別のメソッドを記述することになります。char*void

于 2012-07-19T20:29:03.717 に答える
1

あなたのswap関数は引数として期待void**していますが、s を渡しますchar**。それがコンパイラが不平を言うものです。すべてのオブジェクト ポインター型は暗黙的に に変換できますがvoid*、これは には当てはまりませんvoid**。したがって、引数をキャストする必要があります。

swap((void**)&w[1][2], (void**)&w[2][2]);
于 2012-07-19T20:28:14.910 に答える