一、指针的声明
指针,同整型、字符型、浮点型一样,是C语言中的一个变量类型。指针的特别之处在于,其存储的值是内存地址,指针变量是用来存放内存地址的变量。指针变量声明的一般形式为:
type *var_name;
与其他变量不同的是,指针本身作为一种变量,并没有一种通用的声明形式,也即不存在如
pointer ptr;
这样一种通用的声明方式,这是因为指针不仅能写还能读,也就是通过 * 操作符对指针进行解引用(dereference)。我们需要声明指针所指对象的类型才能顺利地进行解引用操作。
二、指针的指针/Pointer to Pointer
指针所映射的对象可以是任意一种数据类型,int、float、char……,也包括用户的自定义类型如结构体和类(C++)。
指针本身作为一种数据类型,当然也存在指针的指针(Pointer to Pointer)。此时需要对指针进行二次解引用才能得到最终所指向的内容。
int a;
int *p1 = &a;
int **p2 = &p1; //a is *p1 or **p2
三、void类型的指针
指针所指的对象可以是任意一种数据类型,包括指针和用户的自定义类型。
除此之外,void类型的指针也是存在的,可以直接用其他指针赋值,但由于没有映射到任何特定的类型,无法对其进行解引用和算术运算。
int a;
int *p = &a;
void *ptr;
ptr = p; //valid
*ptr = 1; //invalid
*((int*)ptr) = 1; //valid
如果要对void类型指针进行解引用或算术运算操作,需要先进行强制类型转换。
四、指针的算术运算
唯一允许的指针算术运算就是指针±整数值:
int a;
int *p;
p = &a;
/*
pretend address p is 200
size of inteager is 4 bytes
address p+1 is 204
p+2 is 208
p-1 is 196
*/