2025-08-29 02:09:24

以swap函数为例,理解一下C的指针

在c语言的世界里有两种精灵,一个是“普通变量”,另一个是“指针变量”。其中,“指针变量”有一种魔法,就是加了*的指针变量能控制其所对应的“普通变量”的值。

在这个世界里有一类叫做函数的魔法空间,其中有一个叫swap的交换空间。这个魔法空间有一个魔法,就是当变量两个变量(无论是普通变量(如例2所示),还是指针变量(如例3所示))进入这个空间的时候,他们可以交换各自的身份,但是一旦出了这个空间,立马就又恢复了自己的身份。

原来的时候,小精灵们私下是可以自由交换身份的(如例1所示),可是有一天统治者说为了规范变量的行为,于是颁布了新规定:“不可以私下自己交换身份。”然而有些小精灵还是想改变自己的值,可是他们无论怎么在交换空间中游荡都无法做到真正的交换。

后来,普通变量和指针变量坐下来开了一个碰头会,发现利用指针变量的魔法就可以实现他们的目的了。他们是这样做的:让两个要交换值的普通变量对应的指针变量走进交换空间,进入空间的指针变量使用自己的加*魔法,这样他们可以控制交换空间外的其所对应普通变量了。就这样普通变量就在指针变量的控制下进行了交换(例4),等到两个指针变量走出交换空间恢复身份的时候,发现其对应的普通变量的值已经发生了变化。

例 1:int main()

{

int a,b,temp;

a = 10;

b = 20;

printf("a = %d, b = %d\n", a,b);

temp = a;

a = b;

b = temp;

printf("a = %d, b = %d", a,b);

}

>>a = 10, b = 20 >>a = 20, b = 10

例 2:void swap(int x, int y){

int temp;

temp = x;

x = y;

y = temp;

}

int main()

{

int a,b,temp;

a = 10;

b = 20;

printf("a = %d, b = %d\n", a,b);

swap(a,b);

printf("a = %d, b = %d", a,b);

}>>a = 10, b = 20>>a = 10, b = 20

例 3:void swap(int *x, int *y){

int *temp;

temp = x;

x = y;

y = temp;

}

int main()

{

int a,b;

int *p1, *p2;

a = 10;

b = 20;

p1 = &a;

p2 = &b;

printf("a = %d, b = %d\n", a,b);

swap(p1, p2);

printf("a = %d, b = %d", a, b);

}

>>a = 10, b = 20>>a = 10, b = 20

例 4:void swap(int *x, int *y){

int temp;

temp = *x;

*x = *y;

*y = temp;

}

int main()

{

int a,b;

int *p1, *p2;

a = 10;

b = 20;

p1 = &a;

p2 = &b;

printf("a = %d, b = %d\n", a,b);

swap(p1, p2);

printf("a = %d, b = %d", a, b);

}

>>a = 10, b = 20>>a = 20, b = 10