前言:自己思考了下,其实也不知道是不是这样解释的,自己解释了三种情况
1、第一种情况就是直接在主函数中进行地址交换
2、第二种情况就是直接在子函数中进行指针解引用交换
3、第三种情况就是直接在子函数中进行地址交换,这一点就是自己的疑惑点,自己想了下其实主要还是形参和实参和栈区的原因
#include<stdio.h>
#include<Windows.h>
void swap(int *c, int *d) { //传入的是指针a b 中保存的地址
//int *t;
//printf("%d, %d\n", (int)c, (int)d); // 14154240 14154228
//t = c;
//c = d;
//d = t;
//printf("%d, %d\n", (int)a, (int)b); // 14154228 14154240
//主函数main中输出的值不变的原因是,指针c d是形参,接收的是a和b中存储的地址,a和b中存储的地址分别是i和j的地址,接着swap中互相改变了c和d的地址,c和d虽然接收了
//a和b的地址,而且改变的就是c和d中存储的地址,但是需要注意的是c和d这两个指针是在栈区产生的内存空间,随着函数的调用结束也会消失,主函数中取得还是a和b的指针所以不变。
//想一下swap中如果取值的时候然后再交换,c和d接收了a和b的地址 是正确的,然后紧接着就是修改了 c和d中指向的地址的值,那么也就是i和j的值 ,所以也是正确的
//唯一不同的就是一个改变的是指针的地址,一个改变的是指针所指向的地址的变量的值
}
int main() {
int i = 3;
int j = 5;
int *a = &i;
int *b = &j;
int *t;
//printf("%d, %d\n", (int)a, (int)b); // 14154240 14154228
//printf("%d, %d\n", (int)&a, (int)&b); // 14154216, 14154204
t = a;
a = b;
b = t;
//这里同样可以解释的清楚,为什么直接在主函数中交换会直接交换相应的值,因为a和b指针存储的就是i和j的地址啊,交换了地址,自然交换了地址所指向的指
//swap(a, b);
//printf("%d, %d\n", (int)a, (int)b);
printf("%d, %d\n", *a, *b);
system("pause");
return 0;
}
原文地址:https://www.cnblogs.com/zpchcbd/p/12194416.html
时间: 2024-10-15 20:21:22