【时时三省】(C语言基础)怎样定义指针变量
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
定义指针变量的一般形式为
类型名*指针变量名;
如:
int * pointer _ l , * pointer _ 2 ;
左端的int是在定义指针变量时必须指定的“基类型”。指针变量的基类型用来指定此指针变量可以指向的变量的类型。
例如,上面定义的、基类型为int的指针变量pointer _ 1和pointer _ 2,可以用来指向整型的变量i和j,但不能指向浮点型变量a和b。
说明:数据类型(如int,char,float等),既然有这些类型的变量,就可以有指向这些类型变量的指针,因此,指针变量是基本数据类型派生出来的类型,它不能离开基本类型而独立存在。
下面都是合法的定义:
float * pointer _ 3;
char * pointer _ 4;
可以在定义指针变量时,同时对它初始化,如:
int *pointer _ 1 = & a , *pointer 2 = &b ;
说明:在定义指针变量时要注意:
( 1 )指针变量前面的“*”表示该变量为指针型变量。指针变量名是pointer _ l和pointer _ 2,而不是* pointer _ 1和*pointer _ 2。
( 2 )在定义指针变量时必须指定基类型。有的人认为既然指针变量是存放地址的,那么只须指定其为“指针型变量”即可,为什么还要指定基类型呢?要知道不同类型的数据在内存中所占的字节数和存放方式是不同的。指向一个整形变量和指向一个实型变量,其物理上的含义是不同的。
指向一个整型变量和指向一个实型变量,其物理上的含义是不同的。
从另一角度分析,指针变量是用来存放地址的,C的地址信息包括存储单元的位置(内存编号)和类型信息。指针变量的属性应与之匹配。例如:
int a , * p ;
p = & a ;
& a不仅包含变量a的位置(如编号为2000的存储单元),还包括“存储的数据是整型”的信息。现在定义指针变量p的基类型为int,即它所指向的只能是整型数据。这时p能接受& a的信息。
如果改为
float * p;
p = & a ;
& a是“整型变量a的地址”。
在用Vicual C++ 6.0编译时就会出现一个警告( warning ):“把一个int*型数据转换为float *数据”。在赋值时,系统会把& a的基类型自动改换为float型,然后赋给p。但是p不能用这个地址指向整型变量。从以上可以知道指针或地址是包含有类型信息的。应该使赋值号两侧的类型一致,以避免出现意外结果。
指针的移动和指针的运算(加、减)
例如“使指针移动1个位置”或“使指针值加1”,这个1代表什么呢?如果指针是指向一个整型变量的,那么“使指针移动1个位置”意味着移动4个字节,“使指针加1”意味着使地址值加4个字节。如果指针是指向一个字符变量的,则增加的不是4而是1。因此必须指定指针变量所指向的变量的类型,即基类型。一个指针变量只能指向同一个类型的变量,不能忽而指向一个整型变量。忽而指向一个实型变量。在前面定义的pointer _ 1和pointer _ 2只能指向整型数据。一个变量的指针的含义包括两个方面,一是以存储单元编号表示的纯地址(如编号为2000的字节),一是它指向的存储单元的数据类型(如int,char,float等)。在说明变量类型时不能一般地说“a是一个指针变量”,而应完整地说:“a是指向整形数据的指针变量,b是指向单精度型数据的指针变量,c是指向字符型数据的指针变量”
( 3 )如何表示指针类型。指向整型数据的指针类型表示为“int*”,读作“指向int的指针”或简称“int指针”。可以有int*,char *,float *等指针类型,如上面定义的指针变量pointer_3的类型是“float *”,pointer_4的类型是“char*”。int*,float*,char*是3种不同的类型,不能混淆。
( 4 )指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变量。如:
* pointer _ 1 = 100;/ / pointer _ 1是指针变量,100是整数,不合法
原意是想将地址100赋给指针变量pointer_1,但是系统无法辨别它是地址,从形式上看100是整常数,而整常数只能赋给整型变量,而不能赋给指针变量,判为非法。在程序中是不能用一个数值代表地址的,地址只能用地址符“&”得到并赋给一个指针变量,如“p = &a ;”。