以下のプログラムを実行しましたが、内容は入れ替えられませんでした。
#include <stdio.h>
void swap_str(char *x, char *y)
{
char *tmp = x;
x = y;
y = tmp;
}
int main(void)
{
char *s1 = "ABC";
char *s2 = "DEF";
printf("文字列s1は %s です。\n", s1);
printf("文字列s2は %s です。\n", s2);
swap_str(s1, s2);
printf("文字列s1と文字列s2を交換しました。\n");
printf("文字列s1は %s です。\n", s1);
printf("文字列s2は %s です。\n", s2);
return 0;
}
#include <stdio.h>
void swap_str(char **x, char **y)
{
char *tmp = *x;
*x = *y;
*y = tmp;
}
int main(void)
{
char *s1 = "ABC";
char *s2 = "DEF";
printf("文字列s1は %s です。\n", s1);
printf("文字列s2は %s です。\n", s2);
swap_str(&s1, &s2);
printf("文字列s1と文字列s2を交換しました。\n");
printf("文字列s1は %s です。\n", s1);
printf("文字列s2は %s です。\n", s2);
return 0;
}
改善前のプログラムは文字Aと文字Dのアドレスをswap関数に渡し、swap関数においてローカル変数のアドレスを入れ替えても値渡し(?)だからコピーを書き換えても元の文字は変化しない(?)。そもそも文字列リテラルはコンスタント領域にあるので文字Aと文字Dのアドレスは物理的に入れ替えられない(?)。という曖昧な理解です。
改善後のプログラムはポインタs1とポインタs2自身のアドレスを入れ替えることによってs1はDEF、s2はABCを指すようになる。よってmain関数内でswap関数にポインタs1,s2自身のアドレスを渡し、それらを入れ替えている。(尚、ポインタs1,s2はスタック領域なので変更可)…という解釈です。
(ここから質問です)
しかし、改善前のプログラムで値渡しであるから、swap関数でアドレスを入れ替えても元のs1,s2に影響ないと考えるならば改善後のプログラムでも同じ理由です上手くいかないのではないですか?
どうして改善前では上手くいかなく、改善後では上手くいくのかを教えてください。
よろしくお願いしますm(_ _)m