欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-18 11:53:39
C语言篇 1.指针是什么 一个变量的地址称为该变量的“指针”。如果有一个变量专门用来存放另一个变量的地址(即指针),则它称为“指针变量”。指针变量就是地址变量,用来存放地址,指针变量的值是地址(即指针)。 2.指针变量 定义指针的一般形式:类型名 *指针变量名 下面用一张图片来解释一下: 3.指针变 ......

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.通过指针引用数组