2 つの番号を交換する Swap 関数を実装する

ポインタの基礎的な勉強をしたところで、ポインタの役割とは何なのか、Swap関数を使って分析してみましょう。

a と b の値を交換したいとします。

void Swap(int a, int b)//交换不成功
{
    
    
int tmp = a;
a = b;
b = tmp;
}
int main()
{
    
    
int a = 10;
int b = 20;
printf("交换前:%d,%d\n",a,b)
Swap(a,b)
printf("交换后:%d,%d\n",a,b)
return 0;
}

画像を見る
ここに画像の説明を挿入
とアドレスが違うことが分かりますが、Swap関数でのaとbの値の交換はmainの変数には影響せず、ここでは値渡し(コピー)のみを行っています。
Swap 関数の main の値を変更したい場合は、異なる関数間の制限を突破する必要があります。次に、ポインターを導入する必要があります。2 番目の関数を見てみましょう。

void Swap(int *p1,int *p2)//交换不成功
{
    
    
int *tmp = p1;
p1 = p2;
p2 = tmp;
}
int main()
{
    
    
int a = 10;
int b = 20;
Swap(&a,&b);
printf("%d %d\n",a,b)
return 0;
}

まだ失敗していることがわかりました。写真を見てみましょう。

ここに画像の説明を挿入

図から、p1 と p2 の内容は実際に交換されていることがわかりますが、a と b の値は交換されていません。
第3版もチェックしてみてください

void Swap(int *p1,int *p2)//程序崩溃
{
    
    
int *tmp;
*tmp=*p1;
*p1=*p2
*p2=*tmp;
}
int main()
{
    
    
int a = 10;
int b = 20;
Swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
}

上記のコードを実行すると、プログラムがクラッシュします。コンパイラは、コンパイル時に初期化されていないローカル変数の使用について警告します。これは、ワイルド ポインターを使用しているためです。
ワイルド ポインタ: ダングリング ポインタとも呼ばれ、アクセスできないアドレスです。このアドレスは存在しないか、存在してもアクセスできない可能性があります。次に、ワイルド ポインターを削除して 4 番目のタイプを調べます。

void Swap(int *p1,int *p2)
{
    
    
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
int main()
{
    
    
int a = 10;
int b = 20;
printf("交换前:%d,%d\n"a,b);
Swap(&a,&b);
printf("交换后:%d,%d\n"a,b);
return 0;
}

実行結果を見てみましょう:
ここに画像の説明を挿入
プロセスを見てみましょう
ここに画像の説明を挿入
![
ここに画像の説明を挿入
結論: 呼び出された関数の変更が呼び出し元の関数に影響を与えたい場合は、 1. ポインタを渡す 2. 逆参照 (アクセス) する必要があります。
ついに終わった。

おすすめ

転載: blog.csdn.net/Serendipity_00/article/details/111180962