1.何为指针
指针是一类特殊的变量,用以寄存其他变量的地址。
我们知道,假若定义一个变量,则这个变量会被随机分配到内存中的几个连续存储单元。每一个存储单元都有一个地址。正因为这些存储单元是一定的,且每种类型的变量长度是固定的,所以只要知道了这些连续存储单元中的第一个的地址,即知道了这个变量在内存中的位置。因此,这几个连续存储单元的首地址就作为这个变量的地址。例如:定义变量“float f;”,假如它被分配到地址为1000、1001、1002、1003的四个连续存储单元,则地址1000就是变量f的地址。而这个地址也成为变量f的指针。
因此,变量的地址就是变量的指针。
2.指针变量的定义与赋值
指针变量的定义的语法格式如下:
1 | 类型标识符 *标识符; |
指针变量可以通过地址运算符“&”来赋值,例如:
1 | float f,*p; //定义一个单精度浮点型变量f,以及一个指针p。注意,变量与指针的类型必须一致。 |
指针变量的初始化语句一般写成:
1 | float f,*p=&f; |
也可以把一个指针的地址值赋值给另一个指针,例如:
1 | int i,*p1,*p2; |
也可以给一个指针赋空值,;例如:
1 | p=NULL; //注意,NULL被预定义在头文件stdio.h中。 |
在头文件stdio.h中NULL与整数0对应。被赋予这样值的指针p称为空指针,它不指向任何有效的数据。因此为了防止错误地使用指针来存取数据,常在指针未被使用前赋值NULL。NULL可以赋值给任何类型的指针。
我们可以用new、delete运算符来创建一个对象并开分配存储空间或者删除所创建的对象并释放所分配的存储空间。它们的语法格式如下:
1 | new 类型名; || new 类型名[元素个数]; |
来看一段书上的例子:
1 | int i=7,*p; |
这个例子可以方便理解两个运算符的用法。
3.关于指针运算符的那些事
指针运算符“*”是单目运算符,运算对象必须放在其右侧,且运算对象只能是指针变量或地址,可以用其来存取相应的存储单元中的数据。
有以下的结论:
1)*&i <=> i;
2)若“p=&i”,则 *p <=> i;
但是,两者的时间复杂度不同。利用*p存取其所指变量的值是间接存取的,所以比直接存取一个变量要费时。
“&”与“*”放在一起作用时有相互“抵消”的作用。(书上是这样写的……)
只要指针变量指向了内存中的某一存储单元,就可以用例如*p的形式来存取该存储单元的数据。
还是书上的例子(改了一个值),:
1 | int *p; |
上述语句中在动态内存存储区中分配了一块存储区域,并将其首地址赋值与指针p,并将整数4869存入该存储区。