指针是以一种灵活的方式来表示变量或者说数据。他只是一个很基础的东西,我们初学它的时候都会觉得很难很抽象,然而后面的大多数地方都会用到指针,然后会有一种看见指针望而却步的感觉,这是我自己的切身感受,但是其实指针并不是C语言的难点,需要的只是多写些代码就会了。
地址
前面说内存的时候也给大家有意无意的提到了这点,我们的变量全部都是在内存中,而内存是一个有很多房间的酒店,每个房间有不同的房间号,这个房间号就是地址。内存被一块一块的分成了很多,当我们的变量存储在内存中时,就有一个地址“编号”。(这个比喻其实并不是很恰当,但是我们可以先这样理解)并且这个编号是独一无二的。
所以我们的每个变量都会有一个地址,而我们今天说的指针就是利用地址来访问变量的一种变量(指针变量)。
指针的形式简单,就是在我们前面讲的变量声明的时候加上*(星号)。
int *a;//指向整型变量a的指针
float *b;//指向单精度浮点数变量b的指针
char *c;//指向字符变量c的指针
我们怎么初始化一个指针呢?
int *a;
int b=5;
a=&b;
我们前面讲了&取地址这个符号,目的是取b这个变量的地址赋值给a。然后*a便是指向5这个变量。所以这里要明白a是地址,*a是指针变量(是一个具体的变量值)。
上图表现了上述的关系。
其实指针的基本语法也就这样。大家肯定还是觉得简单,但是看看下面这个呢?
int a;
*&a=25;
上面这段代码的意思是什么呢?如果你能明白的话,你就已经明白指针了。他是将25赋值给a,但是在真正的编程的时候谁都不会这样做,这里只是让你更加明白指针。
注意事项:
指针变量初始化时,只能通过赋值地址,不能将值赋值给它。
int *a=12;
上面这种做法是错误的。因为指针变量a并不知道12这个地址是什么,能不能访问(但是c语言语法是允许这样做的,但是千万不要这样做)。
int a;
int *b=&a;
上面的代码就是对的。
指针的指针
首先我们必须要知道指针变量,它也是一个变量,所以也会有一个地址来存储它,也就是说指针变量也有地址。
那么指针的指针就是指向指针变量地址的指针。
int **c;
声明方式如上。我们再来看看初始化:
int *a;
int b=5;
int **c;
a=&b;
c=&a;
上图表现了指针的指针。
这里先介绍一些基本的东西,首先会用,然后我们再慢慢深入。后面在具体的编程环境里面再慢慢体会。
既然有指针的指针,那当然也有指针的指针的指针。定义也是类似的,只是我们很少去用了,也根本不太会用上。
指针的运算
指针变量是变量,只要是变量就可以进行加减,以及前面所说的所有操作符。
我们把指针变量,当做普通的变量来进行操作。
int *a;
……
a+=1;
a-=1;
a++;
a--;
通过上图我们可以看看指针的运算,右边是假设的地址,通过加减运算指针可以任意访问上面的地址。
当然这个是有点抽象,后面我们讲数组和指针的关系的时候慢慢讨论这个。
总结
指针是通过地址访问变量的一种变量。地址的操作更加接近底层,后面我们也会体会到指针的灵活性,本篇主要讲述指针的一些基础东西。