关于两个数据交换的问题。首先会有同学会想到如下的实现:
小菜一碟,不到1分种搞定,满心欢喜的以为没啥问题,运行程序一看,跟交换后的数据是一样
这是为什么呢?
原来函数体是形参,当程序把实参传入时,只是作用在函数体内,待执行完函数后,相应的交换
数据也就不升效,会被释放掉了,所以需要引入指针形参 的形式来进行数据的传递,程序如下:
方法三:
方法四:
还有一种是堆栈方式,改变出栈顺序,嵌入汇编如下:
int swap(int value1, int value2)
{
int temp = 0;
temp = value1;
value1 = value2;
value2 = temp;
}
int main(int argc, char *argv[])
{
int number1 = 10;
int number2 = 20;
printf("Before swap the two number is: number1=%d, number2=%d\n", number1,number2);
swap(number1, number2);
printf("After swap the two number is:number1=%d, number2=%d\n", number1, number2);
}
小菜一碟,不到1分种搞定,满心欢喜的以为没啥问题,运行程序一看,跟交换后的数据是一样
这是为什么呢?
原来函数体是形参,当程序把实参传入时,只是作用在函数体内,待执行完函数后,相应的交换
数据也就不升效,会被释放掉了,所以需要引入指针形参 的形式来进行数据的传递,程序如下:
/*
*function: 对两个数据进行交换
*/
int swap(int *value1, int *value2)
{
int temp = 0;
temp = *value1;
*value1 = *value2;
*value2 = temp;
printf("swap the two number : value1 = %d, value2 = %d\n", *value1, *value2);
}
除此以上的方法,还有如下算法也可以对两数据进行交换:
int exchange(int *value1, int *value2)
{
*value1 = *value1 ^ *value2;
*value2 = *value1 ^ *value2;
*value1 = *value1 ^ *value2;
printf("exchang the two number : value1 = %d, value2=%d\n", *value1, *value2);
}
方法三:
int change(int *value1, int *value2)
{
*value1 = (*value1) * (*value2);
*value2 = (*value1) / (*value2);
*value1 = (*value1) / (*value2);
printf("change the two numbers : value1 = %d, value2=%d\n", *value1, *value2);
}
方法四:
int replace(int *value1, int *value2)
{
*value1 = (*value1) + (*value2);
*value2 = (*value1) - (*value2);
*value1 = (*value1) - (*value2);
printf("replace the two numbers : value1 = %d, value2 = %d\n", *value1, *value2);
}
还有一种是堆栈方式,改变出栈顺序,嵌入汇编如下:
__asm
{
push number1
push number2
pop number1
pop number2
}
以上的几种方法可能会用在不同的场合,也是笔试中经常会考到的,应该还有别的,待以后在进行补充哈!!!