我们在编写程序时,可以认为变量就仅有两个属性:名称和值,可是计算机在编译程序时认为为变量就只有地址和值两个属性。很多编程语言都无法对地址进行直接操作,但c语言可以对地址进行操作,通过“&”与指针变量可以操控地址。因为这一属性,c语言在高级语言中算是比较贴近于硬件的了,所以从某种程度上说,c语言是高级语言中的“低级语言”,因为比其他高级语言更加贴近于硬件,所以在嵌入式编程中通常都是用c语言编程的。
对于指针,我们听过这么一句话“指针就是地址”。这句话很好地阐明了指针这个概念。我们要谈指针,肯定要先声明它,因为指针也是一个变量,要使用它就得先声明它,声明它的语句如下:
int * p;
这里用到了一新的形式,int后面加上*,这里的*和我们的乘不同,它是一个新的符号,叫做间接运算符或解引用运算符。
int * p; 实际上就定义了一个指针变量p,它的任务就是指向一个地址,所以用p的时候后面通常要跟一个地址。
p=&a;
它的意思是把a的地址传递给p,这样p就得到了一个地址,就变得有意义起来了。所以图示为
P-->a的地址-->a的内容
所以当有一个 P=10;这条语句出现时就直接是报错了。这条语句通常是被认为是野指针。p是指针变量,只能对地址操作,而常量不是地址,所以就直接出错。
但下面的这条语句就是可以的了:
p=&a;
*p=10;
为什么加上一个“*”就可以跟一个常量呢?其实这正是间接运运算符(解引用运算符)的奥妙所在。间接指的是p以前是直接引用a的地址,加上*以后就变成了间接通过引用a的地址来引用a地址下的内容。解引用就是解开了p-->a的地址这层引用,然后成了p--﹥a的地址下的内容,*的含义便在其中。
一般专业程序员比较喜欢在声明指针时将*与p用空格隔开。我感觉主要是因为比较方便看p与*p的类型。语句int * p。可以看到,*p用后,还剩一个int,所以*p是一个int型的,能跟一个常量。然而用p的话还剩一个int *,所以p是int *型,即指针型,只能跟地址。
通过以上分析,就慢慢理解了指针的含义了。…………