这段程序的两个值并没有交换,但初学者很容易认为是交换了。
void exchange(int ,int);
void exchange(int ,int){
int tmp;
tmp = one;
one = another;
another = tmp;
}
int main(){
int num1;
int num2;
exchange(num1,num2);
printf(“交换后 : %d %d”,num1,num2);
return 0;
}
从main()函数开始,4字节整型变量num1先进入“堆栈系统”中申请4字节的空间,然后4字节整型变量num2也申请了4字节的空间在num1的上面。
操作系统为了保护主函数的信息,申请了4字节的空间用来保护主函数的现场信息。
当调用exchange()函数时,从左往右,先进入4字节整型形参another,栈顶指针往上移4个字节,然后,4字节整型形参one进入栈中,最后局部变
量tmp进入栈指针向上移4字节。将one所指向空间的值,赋值给tmp,再将another所指向空间的值,赋值给one所指向空间,最后将tmp的值赋值another
所指向的空间,但是,num1与num2的值根本没有改变!!!
下面代码才是真正实现两个值的交换的代码:
realExchange(&num1,&num2);
void realExchange(int * one,int *another){
int tmp;
tmp = *one;
*one = *another;
*another = tmp;
}
int main(){
int num1;
int num2;
scanf("%d %d",&num1,&num2);
exchange(&num1,&num2);
printf(“交换后: %d %d”,num1,num2);
return 0;
}
以上这段代码才是真正的交换num1和num2的值!!!
从main()函数开始,4字节整型变量num1先进入“堆栈系统”中申请4字节的空间,然后4字节整型变量num2也申请了4字节的空间在num1的上面。
操作系统为了保护主函数的信息,申请了4字节的空间用来保护主函数的现场信息。
进入realexchange()函数时,将one所指向的空间(num1)的值,赋給tmp空间,再将another所指向空间(num2)的值,赋值給one所指向的
空间(num1),最后将tmp的值赋值给another所指向的空间(num2),此时,num1的值才与num2的值交换了!
原文:https://www.cnblogs.com/youdiaodaxue16/p/8822676.html