《指针》---可爱又迷人的角色

2018-09-10 00:58:19来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

C语言篇

 


 

  1.指针是什么

一个变量的地址称为该变量的“指针”。如果有一个变量专门用来存放另一个变量的地址(即指针),则它称为“指针变量”。指针变量就是地址变量,用来存放地址,指针变量的值是地址(即指针)。

2.指针变量

  定义指针的一般形式:类型名 *指针变量名

1 int a=10;
2 int *p=&a;

   下面用一张图片来解释一下:

  3.指针变量作为函数参数

  提示:本节将用三个不同swap函数来解释“值传递”和“指针传递”的不同和注意事项。

  (1)值传递 

 1 #include<iostream>
 2 using namespace std;
 3 
 4 void swap(int x, int y)
 5 {
 6     int c;
 7     c = x;
 8     x = y;
 9     y = c;
10 
11     cout << x << " " << y << endl;
12 }
13 
14 void main()
15 {
16     int a = 3, b = 4;
17     
18     swap(3, 4);
19     cout << a << " " << b << endl;
20 
21     system("pause");
22 }

   运行结果如下图:

  现象:函数执行过程中a,b的值发生了互换,函数结束后a,b的值没变。

  解释:“单向传递”的“值传递”方式,形参值的改变不能使实参的值随之改变。也就是本题中x,y的改变不会影响a,b的改变。

  解决方案:为了让函数中发生的改变,在函数结束时还能保留以供我们使用,我们应该用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生改变,函数执行结束后这些变量值的变化依然保留下来,这样就达到了我们的目的。

  (2)指针传递

 1 #include<iostream>
 2 using namespace std;
 3 
 4 void swap(int *p1, int *p2)
 5 {
 6     int temp;
 7     temp = *p1;
 8     *p1 = *p2;
 9     *p2 = temp;
10 
11     cout << *p1 << " " << *p2 << endl;
12 }
13 
14 void main()
15 {
16     int a = 3, b = 4;
17     int *pointer_1 = &a, *pointer_2 = &b;
18     
19     swap(pointer_1, pointer_2);
20     cout << a << " " << b << endl;
21 
22     system("pause");
23 }

  运行结果如下图:

  现象:函数执行过程中a,b的值发生了互换,函数结束后这个变化保留了下来。

  解释:注意6,7,8,9这四行代码,我首先设置了一个int类型的变量,然后通过指针的方式访问到a的值,并且完成了a,b值的交换。注意代码执行完以后,指针变量pointer_1和pointer_2的值没有发生变化,只是内存里的值发生了变化。

  通俗的解释:假设a住在2001号房间,b住在2004房间,通过指针操作使得房间号保持不变,而a和b互换。这种变化不管是直接通过变量名a,b来访问还是通过指针(房间号)来访问都在函数执行完毕后保留下来。

  图片解释:

  易错点:第6,7行处!!!

int *temp;
*temp = *p1;

  注意,int *temp声明了一个指针变量,但是却没有给temp赋值,所以temp中并没有确定的值(它的值是不可预见的),所以temp所指向的内存单元也是不可预见的。所以,对*temp赋值就是向一个未知的存储单元赋值,会导致错误。

  而int temp;定义了一个int类型的变量,在编译时系统会自动给temp分配一块内存空间,所以后续的temp=*p1就是往指定的内存空间写东西,是正确的形式。

  (3)不能试图通过改变指针形参的值来使指针实参发生改变

 1 #include<iostream>
 2 using namespace std;
 3 
 4 void swap2(int *p1, int *p2)       
 5 {
 6     int *temp;
 7     temp = p1;        
 8     p1 = p2;
 9     p2 = temp;
10 
11     cout << *p1 << " " << *p2 << endl;
12 }
13 
14 void main()
15 {
16     int a = 3;int b = 4;
17     int *pointer_1 = &a, *pointer_2 = &b;
18 
19     swap2(pointer_1, pointer_2);
20     cout << a << " " << b << endl;
21 
22     system("pause");
23 }

  运行结果如下图:


  现象:函数执行过程中a,b的值发生了互换,函数结束后a,b的值没变。

  解释:C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。用指针变量作为函数参数时同样要遵循这一规则,不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值

  (4)三种swap函数的总结

  4.通过指针引用数组

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:BZOJ1026: [SCOI2009]windy数(数位dp)

下一篇:StretchBlt函数和BitBlt函数的区别和用法