天天看點

C語言數組值的快速交換1 值、指針、位址2 交換兩個變量的值3 交換兩個指針變量的值4 交換兩個數組指針的值5 交換兩個數組内所有值其他

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(); 

}
           

其他

  1. 也是學了好久用了好久,都沒明白深層的原理,故自己寫了一些實驗例子,總算搞懂了背後的原理。在此分享給大家,希望也能幫到你們。
  2. 由于電腦暫時無法運作C代碼,是以不能貼出運作結果,請大家在自己電腦運作。