定义指针变量的一般形式为:
类型名*指针变量名;
如:int*p1,*p2;
左端的int是在定义指针变量时必须指定的“基类型”。指针变量的基类型用来指定此指针变量可以指向的变量的类型。
例如,int*p1,*p2;
,定义了基类型为int的指针变量p1和p2,可以用来指向整型变量i和j,但不能指向浮点型变量a和b。
说明:
基本的数据类型有(int、char、float等),既然有这些类型的变量,就可以有指向这些类型变量的指针,因此,指针变量是基本数据类型派生出来的类型,它不能离开基本类型独立存在。
下面的定义都是合法的:
float* p3; //p3是指向float型变量的指针变量,简称float指针
char* p4; //p4是指向char型变量的指针变量,简称char指针
也可以在定义指针的同时对它初始化,如:
int*p1=&a,*p2=&b; //定义指针变量p1,p2并分别指向a,b
在定义指针变量时要注意:
(1)指针变量前面的*
表示该变量为指针型变量。指针变量名是p1
和p2
,而不是*p1
和*p2
。要注意给指针变量赋值时,不能写成这样*p1=&a;
,因为a的地址是赋给指针变量p1,而不是赋给*p1(即变量a)。
(2)在定义指针变量时必须指定基类型。不同的数据类型在内存中所占的字节数和存放方式不同。
指针变量是用来存放地址的,C语言的地址信息包括存储单元的位置信息和类型信息。指针变量的属性应与之匹配。例如:
int a,*p;
p=&a;
&a不仅包含变量a的位置(如编号为2000的存储单元),还包括“存储的数据类型”的信息。定义指针变量p的基类型为int,即它所指向的只能是整型数据,这时p才能接受&a的信息。
如果改为:
int a;
float*p;
p=&a;
&a是“整型变量a的地址”。编译时会出现一个警告:“把一个int型数据转换为float型数据”在赋值时,系统会把&a的基类型自动改换为float型,然后赋给p。但是p不能用这个地址指向整型变量。
所以指针或地址是包含有类型信息的。应该使赋值号两侧的类型一致,以避免出现意外结果。
指针的移动:
如果指针是指向一个整型变量的,那么“使指针移动1个位置”意味着移动4个字节。如果指针是指向一个字符变量的,则增加的是1。
所以必须指定指针变量所指向的变量的类型,即基类型。一个指针变量只能指向同一个类型的变量,不能忽而指向一个整型变量,忽而指向一个浮点型变量。
一个变量的指针的含义:
包含两个方面:一是以存储单元编号表示的纯地址(如编号为2000的字节),另一个是它指向的存储单元的类型(如int,char,float等)。
在说明变量类型时一般不能说“a是一个指针变量”,而应该完整地说:“a是指向整型数据的指针变量”。
(3)如何表示指针类型。指向整型数据的指针类型表示为“int*”,读作“指向int的指针”或简称“int指针”。
(4)指针变量中只能存放地址(即指针),不要将一个整数赋给一个指针变量。如*p=100
,*p是指针变量,100是整数,不合法。在程序中不能用一个数值代表地址,地址只能用地址符“&”得到并赋给一个指针变量,如“p=&a;”。