指针指针
C 语言是最常使用指针的语言之一,我们在初学 C 语言时可能就会因为指针这个概念而头疼,我在这里将重述指针在 C 语言里的作用及使用过程。
尽管其它高级语言中可能并没有明显地使用指针的痕迹,但实际上指针仍然蕴含在那些高级语言的细微之处,可以说涉及到对地址的引用操作离不开指针的概念。
指针的定义
在计算机科学中,指针(英语:Pointer),是编程语言中的一类数据类型及其对象或变量,用来表示或存储一个存储器地址,这个地址的值直接指向(points to)存在该地址的对象的值。 ——维基百科
在1964年,哈罗德·劳森发明了最早的指针。他在PL/I中实现出了这个概念,其他高级编程语言也很快跟进,使用了这个想法。
如果想要理解指针的概念,我们就不能不去观察它的使用过程。
首先我们需要回忆下我们学习 C 语言指针时的痛苦记忆,我在此提出以下几个一堆问题:
当我们在 C 语言中使用指针时,我们究竟在使用什么?操作指针意味着什么?为什么为指针变量进行赋值时,有时被赋值的变量前需要加&
?加&
与不加&
的区别在哪里?为什么使用scanf()
为变量进行输入时,需要在变量前加&
,而printf()
则不需要呢?
借着解答这些问题的过程我们来深刻理解指针的操作。
scanf() 函数对变量输入需要 &
当我们需要对变量使用scanf
进行输入时,例:
#include<stdio.h>
int main(){
int a;
scanf("%d", &a);
printf("%d", a);
return 0;
}
变量前需要添加&
,这个符号意味着取地址,意味着把a
这个变量的地址传入scanf()
函数内,之所以需要传入地址,而不是一个普通变量是因为这个scanf()
函数它是个函数。
你以为我说了句废话?其实不是的。
让我们回忆下我们刚学到函数时,我们的老师是否有向我们提过,函数的参数传递是值传递或者地址传递,即使没有学过或者忘记了并不要紧,我将再次重述函数的 C 语言函数参数传递知识。
C语言函数参数传递
当我们创建一个自定义的函数,然后为这个函数传递一个变量进去,并且期望自定义函数能够改变这个变量的值时,我们最终会发现这个期望极其容易落空。
#include<stdio.h>
void changValue(int a){
a = 2;
}
int main(){
int a = 1;
changValue(a);
printf("%d", a);
return 0;
}
对a
的输出结果实际上还是 1 ,changeValue
并不能真的改变a
的值。
因为这里新建的changeValue
函数对a
执行的是值传递,意思是只将a
的值传递给函数中新声明的a
,这两个实际上并不相等,如果这个世界上存在着和你长相完全一样的人,那他也不会成为你,因为你们有着完全不同的生活经历。
但是我们可以通过传递地址的方式,从源头上改变a
的值。
#include <stdio.h>
void changeValue(int *a)
{
*a = 2;
}
int main()
{
int a