4

このプログラムでは、最初の 2 つの名前を入れ替えました

#include<stdio.h>
void swap(char **,char **);
main()
{
 char *name[4]={"amol", "robin", "shanu" };
 swap(&name[0],&name[2]);
 printf("%s %s",name[0],name[2]);
}
void swap(char **x,char **y)
 {
 char *temp;
 temp=*x;
 *x=*y;
 *y=temp;
 }

このプログラムは完全に動作しますが、使用するfunction swap(char *,char *)とアドレスがスワップされないのはなぜですか? なぜポインターからポインターを使用する必要があるのですか?

4

4 に答える 4

6

整数を交換するには、次のように機能することを理解していると思いますswap(int *, int *)

同様に、 である文字列を交換したい場合char *。のような関数が必要ですswap(char **, char **)

そのような場合、それらのポインターを取得してその内容を交換します (そうしないと、関数が戻ったときに値が交換されません)。整数コンテンツの場合、ポインタはint *であり、文字列コンテンツの場合、char *それへのポインタですchar **

于 2012-08-25T08:48:52.750 に答える
4

ポインター (すべての値と同様) は、値によって渡されます。

これを使用swap(char * a,char * b)して記述するとa = tmp;、ローカル変数のみが変更aされ、呼び出し元の元の変数は変更されません。

この単純な例も、同じ理由で意図したとおりに機能しません。

void change(int x) {
    x = 0; // Only changes the local variable.
}

int main(void) { 
    int x = 0;
    change(x);       // This does not have any effect.
    printf("%d", x); // 0 is printed
    return 0; 
} 

http://ideone.com/u7Prp

于 2012-08-25T08:41:51.970 に答える
0

char *name[4]3つの文字列リテラルのアドレスを保持しています。スワップする場合は、文字列リテラルのアドレスが正確に格納されている配列の参照を渡す必要があります。つまりname+0、andname+2または&name[0]and&name[2]をswap関数に渡す必要があります。

また、交換したい場合。アドレスをとして受け取る必要がありますchar **。次に、配列内の文字列リテラルのアドレスを変更する必要があります。

それをとして受け取り、char *のように変更しようとするとtemp = x; x = y; y = temp、それは関数へのローカル変更になりますswap。配列には反映されませんname

于 2012-08-25T08:54:37.280 に答える
-1

これがあなたが探しているもののように聞こえます:

#include<stdio.h>
void swap(char *,char *);
main()
{
 char name[4][10]={"amol", "robin", "shanu" };
 swap(name[0],name[2]);
 printf("%s %s",name[0],name[2]);
}
void swap(char *x,char *y)
 {
 char *temp;
 temp=x;
 x=y;
 y=temp;
 }

主な違いは名前の宣言です。あなたのバージョンでは、ポインタの配列を宣言しているので、エントリを *name[0] として逆参照する必要があります。2 番目のバージョンでは、「char 配列」または文字列の配列を宣言し、各エントリはポインタではなく文字列を保持するため、エントリを name[0] として逆参照できます。gdb を使用し、print コマンドを使用しながらコードをステップ実行すると、違いがはっきりとわかります。

于 2012-08-25T09:01:05.127 に答える