关于【指针作为形参,改变实参的值】的理解!

0x01

  先上代码:

 1 #include <stdio.h>
 2 
 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 #include <stdio.h>
 2 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

  其实不只是指针作为形参改变实参,而是指针就具有这个“特性”。

  

posted @ 2016-08-10 00:19  0dmin'blog  阅读(13818)  评论(3编辑  收藏  举报
TOP