C语言中如何交换两个指针变量的的值

C语言中如何交换两个指针变量的的值,第1张

交换两个指针变量的的值有两种不同的形式:

在指针定义所在函数交换两个指针变量的值

这种交换,与交换两个整型变量的值方法相同,分三步:

先将pa存储到临时变量pt中,

再将pb存储到pa中,

最后将pt存储到pb中

通过自定义函数进行交换两个指针变量的值

这种交换,必须要传递两个指针变量的地址到自定义函数中(即函数的形参是二维指针),然后在函数中对收到的二维指针变量中的内容进行交换,即可实现实参的交换。

参考代码:

不知道你要交换的两个变量类型,所以这里以整型数据交换为例,以下swap函数实现了交换两个整型变量值的功能:

#include <stdioh>

// 交换给定指针指向整型变量的值。

// 参数:

// a -> 指向第一个变量的指针

// b -> 指向第二个变量的指针

void swap(int a, int  b);

int main(int argc, int argv)

{

int a = 3, b = 5;

printf_s("交换前:a = %d, b = %d\n", a, b);

swap(&a, &b);

printf_s("交换后:a = %d, b = %d\n", a, b);

return 0;

}

// 交换给定指针指向整型变量的值。

// 参数:

// a -> 指向第一个变量的指针

// b -> 指向第二个变量的指针

void swap(int a, int b)

{

// 声明一个临时变量,保存第一个指针指向变量

// 的值。

// 其中 a 是取出 a 指针指向变量的值

int temp = a;

// 将 b 指针指向的值赋值给 a 指针指向变量

(a) = (b);

// 将临时变量 temp 中保存的 a 指针指向变量的值赋值给

// b 指针指向的变量。

(b) = temp;

}

以上代码运行结果如下:

以下代码实现了使用宏定义作为模板,声明不同类型交换函数的功能,以下以声明double和float为例:

#include <stdioh> 

// 声明一个函数代码模板,逻辑参考 swap(int a, int b)

#define DEF_SWAP_FUNC(Type) void swap_##Type(Type a, Type b) \

{ \

Type temp = (a); \

(a) = (b); \

(b) = temp; \

// 使用模板声明并实现一个 double 类型变量交换函数,函数名为 swap_double

DEF_SWAP_FUNC(double)

// 使用模板声明并实现一个 float 类型变量交换函数,函数名为 swap_float

DEF_SWAP_FUNC(float)

int main(int argc, int argv)

{

// double 类型数据交换

double da = 56, db = 35;

printf_s("double 交换前:da = %lf, db = %lf\n", da, db);

swap_double(&da, &db);

printf_s("double 交换后:da = %lf, db = %lf\n", da, db);

// float 类型数据交换

float fa = 34, fb = 68;

printf_s("float 交换前:fa = %f, fb = %f\n", fa, fb);

swap_float(&fa, &fb);

printf_s("float 交换前:fa = %f, fb = %f\n", fa, fb);

return 0;

}

运行结果如下:

因为在函数中的参数,并不是调用者的变量,而是临时申请的变量a和b存放main函数中变量a和b的值,并在函数中用来计算,在fun中给a和b赋值都是在 *** 作这两个临时申请的变量,函数返回后,这两个变量被舍弃,函数调用也没有将这两个临时变量的值返回给main函数中调用使用的参数功能。

所以,在函数中要 *** 作调用者申请的变量,需要给出它们的指针,函数中用指针来找到这些变量的位置和内容。

void

swap(int

a,int

b)

{

int

temp=0;

temp=a;

a=b;

b=temp;

}

因为是指针,只要更换指针内的内容就可以了;

还有一种是

换指针,就设a指向没存A,b指向内存B,交换后把b指向内存A,把a指向内存B

void

swap(int

a,int

b)

{

int

temp;

temp=a;

a=b;

b=temp;

}

#include <stdioh>

#include <stdlibh>

int main(void)

{ int a,b;

  void swap(int x,int y);

  scanf("%d%d",&a,&b);

  swap(&a,&b);

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

  system("PAUSE");

  return 0;

}

void swap(int x,int y)

{

    int c;

    c=x;

    x=y;

    y=c;

}

因为void

gsd(int

a,int

b)中的a和b在调用时用实参的值进行拷贝,在函数中交换的只是拷贝过来的副本,所以原来的实参值并没有发生交换 *** 作。而在void

gsd(int

&a,int

&b)中int

&类型使a和b的性质发生了变量,它们是“引用变量”,调用时它们就成了实参的“别名”——就是说在函数中 *** 作的是实参本身,所以结果实参发生了交换变化——int

&等类型是C++引入的新类型,C是没有的。要搞清楚的是int

&是“整型引用”,并不是指针;整型指针是int

。建议你不要用“鄙视”这样的字眼,谁答得不好你大可不理会;这里没有什么都明白的人,都明白的人不到这里来!不明白可续问……

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12163029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存