1. 在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。编译系统根据程序中定义的变量类型,分配一定长度的空间。一般整形变量分配4个字节,字符型变量分配1个字节。内存区的每一个字节有一个编号,即“地址”。
2. 由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。将地址形象化的称为“指针”。
3. 在程序中一般是通过变量名来引用变量的值。实际上,是通过变量名找到存储单元的地址,从而对存储单元进行存取操作的。程序经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。
4. 可以定义一种特殊的变量,用它存放地址。
5. 指向就是通过地址来体现的。由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元。将地址形象化地称为“指针”意思是通过它能找到以它为地址的内存单元。
6. 一个变量的地址称为该变量的“指针”。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。指针变量就是地址变量,用来存放地址,指针变量的值是地址(即指针)。注意区分“指针”和“指针变量”。指针是一个地址,而指针变量是存放地址的变量。
7. 定义指针变量的一般形式为
类型名 *指针变量名;
如 int *pointer_1,*pointer_2;
左端的int是在定义指针变量时必须指定的“基类型”。指针变量的基类型用来指定此指针变量可以指向的变量的类型。
说明:
(1) 指针变量前面的“*”表示该变量的类型为指针变量。指针变量名是pointer_1和pointer_2,而不是*pointer_1和*pointer_2。
(2) 定义指针变量时必须指定基类型。因为,不同类型的数据在内存中所占的字节数和存放方式是不同的(如整型4字节,字符型占1字节)。如果想通过指针引用一个变量,只知道地址是不够的,因为无法判定是从一个地址的一个字节中取出一个字符数据还是从一个地址的四个字节取出一个整型数据。另外,指针的运算(指针加一或减一)要根据指针变量的类型来计算。
8.(1)& 取地址运算符。&a是变量a的地址。
(2)* 指针运算符(或称“间接访问”运算符),*p代表指针变量p指向的对象。
9.指针变量作为函数参数
函数定义:
Void swap(int *p1,int *p2)
{
Int temp;
Temp = *p1;
*p1 = *p2;
*p2 = temp;
}
函数调用:
Int *pointer_1,*pointer_2;
pointer_1= &a;pointer_2 = &b;
swap(pointer_1,pointer_2);
10.数组元素的指针:所谓数组元素的指针就是数组元素的地址。
C中,数组名(不包括形参数组名,形参数组名不占据实际的内存单元)代表数组中首元素的地址。例如下面两条语句等价
Int *p;
Int a[10] = {0};
P = &a[0];与p = a;//两条语句等价
在引用数组元素时指针的运算(指针即地址,很明显对地址进行乘除运算是没有意义的),但是在一定条件下对指针进行加和减是允许的,即,当指针指向数组元素的时候,是可以对指针进行加和减的。
说明:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组的下一个元素,p-1指向同一数组中的上一个元素。注意:执行p+1时并不是将p的值(地址)简单加1,而是加上一个数组元素所占用的字节数。
11.通过指针引用数组元素
下标法,如a[i]形式;
指针法,如*(a+i)或*(p+i).
12.使用指针对数组运算比较快
Int a[10];int *p;
for(p = a;p<(a+10);p++)
cout<<*p;
摘自《c程序设计》谭浩强编著