C語言數組值的快速交換
- 1 值、指針、位址
- 2 交換兩個變量的值
- 3 交換兩個指針變量的值
- 4 交換兩個數組指針的值
- 5 交換兩個數組内所有值
- 其他
HPC_ZY
通過幾個簡單示例,直覺展示“值、位址、指針、數組指針”的關系與工作方式。需要自行運作下列代碼,觀察分析其輸出結果,進而了解其中的原理。
如果隻是來看數組值的快速交換,可直接跳到5
1 值、指針、位址
#include "stdafx.h"
#include "malloc.h"
void main()
{
// 初始化
int *a = new int[1];
a[0] = 123;
// 取指針指向的值
printf("a[0] = %d\n", a[0]); // 最常用的取值方式
printf("*a = %d\n", *a); // 利用取值符
// 取指針位址
printf("a = %0x\n", a); // 最常用的取位址(a本來就是指針,存的位址)
printf("&a[0] = %0x\n", &a[0]); // 利用取位址符
// 取存儲指針的位址
printf("&a = %0x\n", &a); // 利用取位址符
// 結束
printf("done");
getchar();
}
2 交換兩個變量的值
/*交換兩個變量的值(排序算法中常用到)*/
void main1()
{
// 初始化
int a = 23;
int b = 7;
int tmp;
// 顯示
printf("a = %d\n", a);
printf("&a = %0x\n", &a);
printf("b = %d\n", b);
printf("&b = %0x\n", &b);
printf("&tmp = %0x\n\n", &tmp);
// 交換
tmp = a;
a = b;
b = tmp;
// 顯示
printf("a = %d\n", a);
printf("&a = %0x\n", &a);
printf("b = %d\n", b);
printf("&b = %0x\n", &b);
printf("tmp = %d\n", tmp);
printf("&tmp = %0x\n\n", &tmp);
printf("done");
getchar();
}
3 交換兩個指針變量的值
/*交換兩個指針變量的值*/
void main2()
{
// 初始化
int *a = new int[1];
int *b = new int[1];
a[0] = 27;
b[0] = 9;
int *tmp;
// 顯示
printf("*a = %d\n", *a);
printf("a[0] = %d\n", a[0]);
printf("a = %d\n", a);
printf("&a = %0x\n", &a);
printf("b[0] = %d\n", b[0]);
printf("b = %d\n", b);
printf("&b = %0x\n", &b);
printf("&tmp = %0x\n\n", &tmp);
// 交換
tmp = a;
a = b;
b = tmp;
// 顯示
printf("a = %d\n", a);
printf("&a = %0x\n", &a);
printf("b = %d\n", b);
printf("&b = %0x\n", &b);
printf("tmp = %d\n", tmp);
printf("&tmp = %0x\n\n", &tmp);
printf("done");
getchar();
}
4 交換兩個數組指針的值
/*交換兩個數組指針的值*/
void main3()
{
// 初始化
int N = 4;
int *A = (int*)malloc(N);
int *B = (int*)malloc(N);
for (int k = 0; k < N; k++)
{
A[k] = k;
B[k] = k + N;
}
// 顯示
printf("\n\n交換前: A = ");
for (int k = 0; k < N; k++)
printf("%d ", A[k]);
printf("\n交換前: B = ");
for (int k = 0; k < N; k++)
printf("%d ", B[k]);
// 交換
int *tmp = A;
printf("\nA = %0x\n", A);
printf("&A = %0x\n", &A);
printf("\nB = %0x\n", B);
printf("&B = %0x\n", &B);
printf("\ntmp = %0x\n", tmp);
printf("&tmp = %0x\n", &tmp);
A = B;
B = tmp;
printf("\nA = %0x\n", A);
printf("&A = %0x\n", &A);
printf("\nB = %0x\n", B);
printf("&B = %0x\n", &B);
// 顯示
printf("\n\n交換前: A = ");
for (int k = 0; k < N; k++)
printf("%d ", A[k]);
printf("\n交換前: B = ");
for (int k = 0; k < N; k++)
printf("%d ", B[k]);
printf("\n\n\ndone");
getchar();
}
5 交換兩個數組内所有值
比如,A = [0,1,2,3],B=[4,5,6,7];要交換他們的值,得到 B = [0,1,2,3],A=[4,5,6,7]。
注:其實就是4中的例子
/*交換兩個數組指針的值*/
void main3()
{
// 初始化
int N = 4;
int *A = (int*)malloc(N);
int *B = (int*)malloc(N);
for (int k = 0; k < N; k++)
{
A[k] = k;
B[k] = k + N;
}
// 顯示
printf("\n\n交換前: A = ");
for (int k = 0; k < N; k++)
printf("%d ", A[k]);
printf("\n交換前: B = ");
for (int k = 0; k < N; k++)
printf("%d ", B[k]);
// 交換
int *tmp = A;
A = B;
B = tmp;
// 顯示
printf("\n\n交換前: A = ");
for (int k = 0; k < N; k++)
printf("%d ", A[k]);
printf("\n交換前: B = ");
for (int k = 0; k < N; k++)
printf("%d ", B[k]);
printf("\n\n\ndone");
getchar();
}
其他
- 也是學了好久用了好久,都沒明白深層的原理,故自己寫了一些實驗例子,總算搞懂了背後的原理。在此分享給大家,希望也能幫到你們。
- 由于電腦暫時無法運作C代碼,是以不能貼出運作結果,請大家在自己電腦運作。