2016-06-24 7 views
2

私はCプログラミングの初心者です。本書の交換コードv [i]とv [j]は、次のとおりです。ポインタ配列を使用したスワップ

void swap2(char *v[], int i, int j) { 
    char *temp; 

    temp = v[i]; 
    v[i] = v[j]; 
    v[j] = temp; 
} 

これが正しいかどうかはわかりません。私はvここにポインタを格納する配列だと思うので、v[i]v[j]ポインタです。ここでもtempはcharポインタですが、temp = v[i];という文ではポインタにv[i]というポインタが割り当てられていると感じています。char *tempchar tempに変更すると、関数が正しくなると思います。誰かが私にこれを手伝ってもらえますか?

+1

、あなたは 'char'に'のchar * 'を割り当てることだろう、とあなたはおそらくコンパイルエラーを取得したいです。.. –

+0

ポインタ**は**アドレスです。 – Barmar

答えて

3

機能はそのままです。

vは、char *の配列として宣言されています。したがって、それぞれv[i]char *です。したがって、スワップの実行時にchar *を使用します。

+0

ご返信ありがとうございます。しかしなぜ "* temp = v [i]"ではなく "temp = v [i]"と書くことができますか?私はtempがポインタとして知られていても*はまだ表示されているはずです。 –

+1

いいえ、 '* temp'は' char'型なので型の不一致です。 – dbush

+0

'* temp = * v [i]'も機能しますか? –

1

この文は、ポインタv[i]はあなたが文字ポインタの配列と文字の配列を混乱しているように見えるアドレス

に割り当てられていると言う:v[i]は単にのi番目のメンバーでありますアレイはchar *で構成されます。

すべてでは、の値がであるため、ポインタが渡されます。あなたはv[]charポインタを格納する配列であると仮定しています。ポインタが交換されているため

コードが有効ではなく、char変数はで指摘:v[i]v[j]はポインタであり、従ってtempもポインタであるべきです。

次のテストコードは、呼び出し元のという視点から実証しています。あなたの機能で何が起こっているのかを簡単に確認できます。ポインタがスワップされている値として渡されていますが、指す変数charはそのままです(この例ではbc)。あなたが代わりに ``のchar * `の` char`をtemp`行った場合

#include <stdio.h> 

void swap2(char *v[], int i, int j) { 
    char *temp; 

    temp = v[i]; 
    v[i] = v[j]; 
    v[j] = temp; 
} 

int main (void) 
{ 
    char a = '1', b = '2', c = '3', d = '4', e = '5'; 
    char *v[5] = {&a, &b, &c, &d, &e}; 

    for(int i = 0; i < 5; i++) 
     printf("%p:%c ", (void*)(v[i]), *(v[i])); 
    printf ("\n"); 

    swap2(v, 1, 2); 

    for(int i = 0; i < 5; i++) 
     printf("%p:%c ", (void*)(v[i]), *(v[i])); 
    printf ("\n"); 
    printf("b = %c\n", b); 
    printf("c = %c\n", c); 
return 0; 
} 
関連する問題