《指针》---可爱又迷人的角色
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.通过指针引用数组
下一篇: Kotlin入门(27)文件读写操作