【C】回炉自学C语言 指针 swap问题

C语言 指针 swap问题

在主函数种实现变量的交换

现在我们把这交换的行为封装进方法中

swap函数确实进行了交换,打印也是10和5了,但是下面a和b的结果还是5和10

- 形参i 和 形参j 并不是和 a,b一个变量,实参 a,b 传递值给形参 i,j

- 形参i 和 形参j ,还有temp变量,在内存也分配了空间,main函数跳转至swap函数开始执行

- swap函数执行完毕,swap函数和内部的变量一并释放销毁,

- i,j已经销毁,主函数的a,b 依然存在,最后一步打印的还是之前的a,b

- swap函数交换的是这个函数内部的变量,并没有影响主函数的a,b!!!

使用指针形参i 和 j

传值也必须对应的是变量的地址

对指针变量进行交换

- a  值5 地址1001 ,b 值10 地址1002

- 形参:指针变量 i 值收到 &a 1001,指针变量j 值收到 &b 1002 , 声明指针变量temp,

- 三者交换完毕 指针变量 i 值1002,指针变量j 值1001

- 但是a和b还是值5 地址1001 ,值10 地址1002

- 这个问题还是一样,内部的指针变量确实交换了,但是方法结束之后有影响到主函数的a,b了吗?并没有!!!

- 指针变量 i 和 j 收到 a 和 b 的地址

- 把 指针i 的地址反引用获取该值【地址值】存储的值,赋值给 变量temp,这个类型是int 类型,不是int指针类型!!!

- 把 指针j 的地址反引用获取该值【地址值】存储的值 ,赋值给 反引用的 i【*i】

- 把 temp 变量的值,赋值给 反引用的 j【*j】

- 我们这样就对主函数的a变量 和 b变量的值进行了交换

- a 变量的地址 给了指针 i ,i 可以通过*i 操作修改 a变量的值,

也就是说 *i 指向了变量a 的值,变量a可以操作这个值,*i也可以操作

* 的用法:

- 单作操作符,用于相乘运算符

- 定义指针变量  int * p 定义了一个int指针类型变量,标识符是p,p只能存放int类型变量的地址,

- 指向运算符,*p指向了该地址存储的值

#include <stdio.h>

void swap(int * i,int * j){
    int temp = *i;
    *i = *j;
    *j = temp;
}

int main() {
    int a = 5;
    int b = 10;
    printf("a = %d, b = %d \n",a,b);
    swap( &a, &b );
    printf("a = %d, b = %d \n",a,b);
    return 0;
}

《郝斌C语言 自学》 P127 - P129

https://www.bilibili.com/video/BV1os411h77o

猜你喜欢

转载自www.cnblogs.com/mindzone/p/12765345.html