C语言的指针是让新手很头疼的事情,但是由于其太过于灵活,以至于可以很好得的解决一些复杂的问题,因此不得不掌握。我最近正在学习指针相关的内容,因此在这里做一个小的总结。本篇是不涉及到函数以及结构体等复杂的使用方法,仅仅讨论一下指针的基本使用方法。
首先我们区分 * 和 & ,这两个运算符, & 我们在scanf函数中经常使用。为了方便理解我们看下面这行代码:
int *p =a;
定义了一个指向a的整型指针,那么有p=&a ; *p =a;
即指针变量的值是地址(&a),*可以理解为取地址 (*p 可以看成 *(&a)取出&a这个地址中的值)。
下面我们看一个复杂点的代码:
int n =0,*p = &n,**q = &p;
这里出现了二级指针,也就是所谓的“指向指针的指针”。 q是指向 int* 型数据的指针变量,首先 p = &n,这行代码很好理解,后面的**q = &p可以拆开来看,首先声明了一个int* 型数据的指针变量 int **q;再给指针型变量赋值 即(*q) = &p;那么问题来了,对于指针的赋值应该如何理解呢?就以上面这行定义为例有下面四个赋值语句
p = 1; *q = 2;q = p;*p = 5;
我们先看p = 1;这个赋值语句,根据我们上面所解释的p =&a;我们知道指针变量的值应该是地址,而p = 1;直接将整数赋给了指针变量,编译时会报错
cannot convert from 'const int' to 'int *'
我们再看*q = 2;根据上面的分析我们知道(*q) = &p;同第一句一样的问题编译时会报错cannot convert from 'const int' to 'int *'
再来看第三句q = p;这句很明显的错了,p是 int* 型数据 而 q是int**型数据,编译时会报错cannot convert from 'int ** ' to 'int *'
我们根据上述p=&a ; *p =a;可以明显的看到*p = 5;这是一个正确的赋值语句。