0x01
先上代码:
1 #include2 3 void swap(int *p, int *q) 4 { 5 int temp; 6 temp = *p; 7 *p = *q; 8 *q = temp; 9 }10 11 int main()12 {13 int a, b;14 int *pa, *pb;15 printf("Enter 2 numbers:\n");16 scanf("%d, %d", &a, &b);17 pa = &a;18 pb = &b;19 20 printf("a = %d, b = %d\n", a, b);21 printf("=====Changed======\n");22 swap(pa, pb);23 printf("a = %d, b = %d\n", a, b);24 }
代码的作用:通过指针交换两个变量的值。
运行结果:
0x02
指针是如何交换两个变量的值的?
首先需要明白下面的东西:
(1)星号"*"的两个作用:①定义指针变量 ②指明指针所指变量的值(间接访问)
(2)指针变量作为函数参数,是将变量的地址传递给函数;
分析:swap()函数的参数是指针变量,所以接收的是变量的地址,【(这段话是在网上看到的)指针传递的是变量的地址,也就是它在内存中的所在位置,它发生改变,变量就改变;一般变量做形参,传递的是变量的值,地址不发生改变,函数在执行过程中调用内存空间,执行完便释放内存空间,所以不改变。】
在交换变量值的代码中,重要的是(*p = *q, *q = temp),这句代码的作用是,将指针q指向的内容赋给指针p所指的区域。
自己的理解:*p = *q; *p指的是指针变量p(*号的作用是定义指针变量),*q指的是间接访问q所指区域中的值(*号的作用是间接访问),将这个值赋予p所指的区域,也就是【地址】,这个地址是传入的a的地址,所以a的地址(或者说a对应的内存空间)中存放的内容就改变了,成了q的所指区域中的值,也就是b的值,这样就完成了交换。重要的还是要分清星号*的两个作用。 ====但是还有疑问,值能直接赋给地址?或者说星号*在等号左右两边的意义不同,在左边表示变量,右边表示间接访问?====
temp = *p; temp是一个整型变量,*p是间接访问指针所指区域的内容,也就是a的值,所以这句代码的作用就是将a的值赋值给temp;
*q = temp; temp之前被赋予a的值,*q指的是指针变量q(*号的作用是定义指针变量),值是b的地址,将a的值放在b的地址中,所以b对应的内存空间中的内容成了a的值。
0x03
下面代码也是同样的道理:
1 #include2 int main() 3 { 4 int a, *p; 5 int b = 10; 6 printf("Enter a number:\n"); 7 scanf("%d", &a); 8 p = &a; 9 printf("a = %d\n", a);10 printf("*p = %d\n", *p);11 12 printf("\n=============\n");13 *p = b;14 printf("a = %d\n", a);15 printf("*p = %d\n", *p);16 }
首先指针p指向变量a,然后通过*p = b; 改变了a的值;
运行结果:
0x04
其实不只是指针作为形参改变实参,而是指针就具有这个“特性”。