指针是一种特殊的变量。它是用来存放某个变量的地址值的一种变量。这一点与一般变量不同。指针变量所表示的数据值是某个变量的在内存中的地址值。一个指针所存放的是某个变量的地址值,称为这个指针指向被存放地址的变量。指针存放哪个变量的地址值,它就指向那个变量。
指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,因为任何数据值的类型都是unsigned long int型的。由于指针度类型是它所指向的变量度类型,而所指向变量的类型不同,则指针的类型也不同。指针可以指向各种类型的变量还可以指向数组(或数组元素),可以指向函数,可以指向文件,还可以指向指针。
定义指针: int a(5);
int *P = &a;
把一个值(内存的某个地址)赋值给指针需要使用“取地址”操作符(&)
int myInt = 904;
int *myPoniter;
myPointer = &myInt;
定义一个指针后,系统便给指针分配一个内存单元,各种不同类型度指针所被分配的内存空间的大小是相同的,因为不同类型的指针存放的数据值都是内存地址。
各类型的指针定义格式如下:
<类型>*<指针名>=<初值>,...;
如,int *p; //pi是一个int型指针
char *pd; //pc是一个字符指针
double *pd; //pd是一个double型指针
int(*pa)[5]; //pa是一个指向一维数组的指针,它指向5个int型元素的一维数组
int(*pf)(); //pf是一个指向类型为int型的函数的指针
int **pp; //pp是一个指向int型指针的指针
知道了某个变量在内存中的地址,就可以利用指针访问位于该地址的数据。这需要对指针做解引用(deference)处理--在指针名的前面加上一个星号*。
在某些场合只有通过指针才能改变某个变量的值。
引用不同于指针,它不是变量,它不占内存,它本身无内存地址,它的地址值是它引用的变量的地址值。引用通常被认为是另一种变量的别名。引用只是被引用的变量或对象的替身。一般定义引用时必须初始化。如:int a = 3;
int &m= a; 这里m是一个引用,它是变量a的别名。所有的引用上所施加的操作,实质上就是在被引用者上的操作。
指针是通过地址间接访问某个变量,而引用是通过别名直接访问某个变量。引用必须初始化,一旦被初始化后不得再作为其他变量的别名。
指针的运算:
(1)赋值运算
(2)一个指针可以加减一个整型数
(3)在一定条件下,指针可以相减
(4)在一定条件下,指针可以比较
数组元素可以用下标表示,也可以用指针表示,采用指针表示往往优于下标表示。
如,int a[i] 指针表示为 *(a+i)
总结:
星号*有两种用途:
一是创建指针:int *myPointer = &myInt;
二是对指针进行解引用: *myPointer = 23; //*myPointer = myInt
数组的名字同时也是一个指向其第一个元素的指针