周游C语言教程10 - 指针
这是周游C语言的第十篇教程,你将在这篇文章里认识指针。
指针
指针就好像是经纬度,有了经纬度就可以找到地球上的任意一个地方。C语言里的指针就能起到经纬度的作用。我们都知道,C语言的变量都存在在内存中,我们对内存进行编号,每个字节都增加一个编号,这样我们就能根据这个编号找到内存中任意一个位置,我们把这个编号称作地址。
取地址
我们定义一个变量通常是不知道它的地址的,因为编译器自动为我们分配了地址空间,当我们想要获取这个变量的地址时,就需要使用&
来获取,同时&变量名
的方式就可以获取到地址。
指针
指针表示它保存的是一段地址,取地址取出的地址就需要用指针来保存。指针和变量本质没有不同,只不过一个存储的是变量本身,一个存储的是变量的地址。就好像普通变量保存了一座武夷山,那指针变量会保存一座山的经纬度,这个经纬度正好是武夷山所在的经纬度。
指针变量和普通变量本质没有不同,所以同样需要声明。
数据类型 *指针名;
只需要在正常声明一个变量的变量名之前加一个*
即可。
int * pInt;// 指向一个int类型变量的指针
double * pDouble;// 指向一个double类型变量的指针
char * pChar;// 指向一个char类型变量的指针
...
这些都是指针,只不过指向的内容表示的数据类型不同。
取内容
现在我们知道了一个变量的地址,但显然我们需要的任然是这个变量本身而不是其地址。使用*
就可以取出地址中内容。
int a = *pInt;
double b = *pDouble;
char c = *pChar;
这个里*
和声明中的*
并不相同,只需要记住声明时的*
表示这个变量是个指针变量,其他时候表示取内容即可。
#include <stdio.h>
int main()
{
int a = 20;
int* pInt = 0;
pInt = &a;
printf("a的值为%d\n",a);
printf("pInt的值为%d\n", pInt);
printf("pInt的指向地址的内容为%d\n", *pInt);
*pInt = 30;
printf("更改后pInt的指向地址的内容为%d\n", *pInt);
}
空指针
令一个指针变量等于0,那这个指针就为空指针。大多数的系统都不允许访问地址为0的内存空间,因此可以用0来表示这个指针没有指向任何一个地址。当其被赋予初值0后,可以使用如下代码来判断指针是否被赋予地址。
if(ptr)//如果指针被赋值,表示有实际意义
{
}
注意
由于C语言定义一个变量时如果没有赋予初始值,那么这个变量的值将会不可预测。对于指针来说这是尤为危险的,比如定义了一个指针变量而没有被赋予初值,由于不可预测,它现在的值是一个很随机的地址,假设这块地址正在被别的程序使用,而你此时通过取内容将它改变。那么别的正常运行的程序就会出现异常,如果这个程序正好是你的操作系统,那么蓝屏正在等着你。
很多现代编译器已经将没有赋予初值的指针列为编译错误,但一些老旧的编译器任然会正常编译,因此你需要极其的注意。