指针是C语言中一种特殊的变量类型,与其他类型的变量不同,指针存储的不是变量,而是变量的地址,正确的使用指针,可以使程序更为简洁高效。指针是C语言中的精髓,同时也是C语言中最难掌握的部分。
指针与指针变量
1,指针的概念
如果在程序中定义一个int a ,那么编译器会根据变量类型,为其分配4个字节地址连续存储空间,若这块空间的首地址为0x0037FBCC,那么这个变量占据0x0037FBCC - 0x0037FBD0(十六进制)这四个字节的空间,0x0037FBCC就是这个变量的地址。因为通过变量的地址可以找到该变量所在的储存空间,该指针是指向该变量的指针。
2,指针变量的定义
指针指示某个变量所在的储存空间,相应的,指针变量存储这个指针,定义指针变量的语法格式如下:
变量类型* 变量名
上述语法中,变量类型指定定义的指针指向数据的类型,变量名前的星号表示该变量为一个指针变量。举例说明:
int* p; // 定义一个int* 型的指针变量
其中*表示p是一个指针变量,int表明该指针变量指向一个int型数据所在地址。
3,指针的初始化
指针变量的赋值有两种方法,一种是接收变量的地址为其赋值,如下所示:
int a = 10;
int* p; // 定义一个int* 型的指针变量
p = &a; // 使int*型的指针变量p指向int型变量a所在的储存空间
另一种是与其他指针变量指向同一块存储空间
int* q;
int* p;
p = q ; //使int型的指针变量q和p指向同一存储空间
在第一种方法中出现的&是取址运算符,作用是获取变量a的地址。该符号在输入函数scanf()中也有出现,这是因为,数据只能由实参传递给形参,而不能反向传递,所以只能通过获取变量地址来对该变量进行操作,也可以在定义的同时为指针的变量赋值,形式如下:
int a = 10;
int* p = &a; // 定义一个int* 型的指针变量
指针变量的引用
所谓的指针变量的引用,就是根据指针变量中存放的地址,访问该地址对应的变量,访问指针变量中指针所指的变量非常简单,只需要在指针变量名之前加一个取值运算符 * 即可,格式如下:
* 指针变量名
具体实例如下:
int a = 10;
int *p = &a;
printf ("%d\n",*p); // 输出的指针变量指向的地址中存储着数据
如上是先访问存储a的地址,*p,然后获取a的数据,所以为间接访问
printf ("%d\n",a);
如上是直接对变量进行访问,称为直接访问。
虽然间接访问比较麻烦,但在如下场合,只能使用间接访问:
- 用户申请一块内存空间时。因为该内存空间没有对应的变量名,所以只能通过首地址对其进行操作。
- 通过被调函数改变主调函数(主函数)变量的值时。由于值只能从实参向形参传递,所以被调函数无法通过改变形参的值去改变主函数中变量的值,只能通过间接访问指针向内存空间来改变函数中变量的值,scanf()函数就是一个很好的例子。