很多人觉得C语言最难的是指针。
指针确实不大好掌握,很多人学到指针就容易犯迷糊,以至于后来Java发展时直接摒弃了指针。
但是请相信我,指针并没有你想象的那么难。
为什么没有那么难?
因为这是小白课程啊,我会尽量给你讲得通俗易懂。
首先我们要了解指针是什么?记住:
指针就是地址,反过来一样,地址就是指针。
所以介绍指针前,我先来讲一下地址。
1 地址
当我们定义一个变量时,这个变量本身其实有三个方面含义:变量名、变量值、变量地址。
例如定义一个整型变量a:
int a = 10 ;
此时变量名为a,变量值为10,还有一个系统分配给它的地址。
我们不能指定变量地址是多少,只能由系统分配。
有时候定义变量时没有初始化,那么变量只有变量名和变量地址,变量的值要等到给它赋值以后才有。
打个比方,定义变量就好像是买房,
int a;
就是告诉系统我要买一间房,房间名字叫a,房间大小是int(规定住进这个房间的人必须是整数,不能是实数或字符),然后系统分配一个地址来存放a,这个地址就相当于房号。
我们不能指定给变量分配什么房号(地址),但我们可以看这个房号(地址)是多少。
看房号是多少,要用一个取地址的运算符,即&。
没错,就是每次我们调用scanf输入数据时,变量前面的那个&。
&的功能就是取出变量的地址。
一般将&念作“at”,它有点类似于邮箱地址里的那个@。@也是念作”at”,at在英文里就是“在哪里”的意思。
如果程序有定义 int a;
那么a的房号就是&a,假设这个房号是1号,那么,如果程序后面有语句:
scanf(“%d”, &a);
意味着,输入一个整数,放到1号房(&a)中。
程序1:
程序输出a的值和a的地址。
程序1运行结果:
a的值是可以更换的,比如第一次a的值是10,后面a的值变了,变成100。
但a的地址在定义变量时就定了,这个地址我们没法赋值,也没法改变。
就是说,定义变量时,是买房,买房就有房号了。但房间里面住的人是可以变的,第一次是10住进去,后来是100住进去。
所以这就叫变量,因为它的值是可以变的。
这个房间可以由不同的人住进去。但每次只能住1人。
当10住进这个房间时,输出的a是10;当100住进去时,输出的a就变成100了。
程序1的运行结果中,不同的电脑显示的地址可能不一样。比如在你的电脑里运行,可能显示的a的地址就不是6487580了。
2 指针
指针是一种数据类型,指针类型简称指针。
那么如果一个变量定义为指针类型,语法格式如下:
数据类型 * 指针变量名 ;
如:
int *p;
float *fp;
char *cp;
那么,上面定义的p、fp、cp都是指针变量名,他们属于指针类型。
指针变量和其他类型的变量有什么区别呢?
定义变量等于买房,那么指针变量比较大方,别的变量买房是要住人的,但指针变量买了不住人,只能住另外一个变量的地址。
指针就是一个大土豪,它买房不是为了住人,诺大的房间只住了另一个变量的房号。
重复一遍:指针变量不能住人,只能住另外一个变量的地址。
例如程序里有:
int a , b ;
float x ;
int *p1 ;
那么,买了两间房a、b,里面可以住整数(int);买了一间房x,里面可以住实数(float),买了一间房p1,p1这个房只能住a的地址或者b的地址。
还记得取地址的运算符吗?是&。
所以,如果有:
a = 10 ; b = 198 ;是对的。
p1 = 10 ; 是错的。
p1 = &a ; 是对的。
p1 = &b ; 也是对的。
但:
p1 = &x ; 是错的。
可能有人会问为什么p1 = &x错?
因为p1的定义是 int *p1;
它只能等于int变量的地址,不能等于其他类型的变量的地址。
程序2:
运行结果:
刚才说过,每个变量本身其实有三个方面含义:变量名、变量值、变量地址。
如果有定义:int a , *p1;
a=10;
p1=&a;
则指针变量名为p1,变量值是a的地址(就是说,p1这个房间里住的是a的房号),而p1也有它自己的地址。
再看一个例子,程序3:
运行结果:
上述程序p1=&a;
变量a的值是10,a的地址是6487580;
变量p1的值是6487580,p1的地址是6487568;
当p1=&b后,
变量b的值是99,b的地址是6487576;
当p1=&b后,
变量p1的值是6487576,p1的地址仍然是6487568。
今天是指针初步,主要带大家理解指针的概念,把程序1、2、3这三个程序读懂理解就完成今天的任务了。
3 总结
本节课介绍了如下内容:
- 取地址运算符: &。
- 指针变量定义语法形式:数据类型 *变量名;
- 每个变量都有三个含义:变量名(房间名)、变量值(房间里住的人)、变量地址(房号)。
介绍了3个程序来帮助各位朋友理解上述概念。
指针还有更多用途,比如结构指针,但第一步我们需要先搞清楚指针的基本概念,然后才能学更深入的知识。