《指针变量定义及引用.docx》由会员分享,可在线阅读,更多相关《指针变量定义及引用.docx(14页珍藏版)》请在优知文库上搜索。
1、指针变量定义及引用1指针是什么如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元空间。编译系统根据程序中定义的变量类型,分配一定长度的空间。内存的管理将内存抽象看作一个很大的一维字符数组,对内存中的每一个字节分配一个32位或64位的编号(与32位或者64位处理器相关),把对这个编号分配称之内存处理。例如,为整数变量分配4个字节(32位),为单精度浮点型变量分配4个字节,为字符型变量分配1个字节。内存区的每一个字节有一个编号,这就是地址。在地址所标志的内存单元中存放的数据,由于通过地址能找到所需的变量单元,地址指向该变量单元。将地址形象化地称为指针。意思是通过它能找到
2、以它为地址的内存单元。在C语言中,数据是分类型的,对不同类型的数据,在内存中分配的存储单元大小(字节数)和存储方式是不同的。如果只是指定了地址IOlO,希望从该单元中调出数据,这是做不到的,虽然能找到所指定的存储单元空间地址,但无法确定是从1个字节中取信息(字符数据),还是从2个字节取信息(短整型),抑或是从4个字节取信息(整型),未说明按何种存储方式存取数据(整数和单精度实数都是4个字节,但存储方式是不同的),只知地址根本提取不了。为了有效地存取一个数据,除了需要位置信息外,还需要有该数据的类型信息(如果没有该数据的类型信息,只有地址位置信息是无法对该数据进行存取的)oC语言中的地址包括位置
3、信息(内存编号)和它所指向的数据的类型信息,或者说它是带类型的地址。如&a,一般称它为变量a的地址,确切地说,它是整型变量a的地址。内存空间随使用随时分配,不用立即释放空间,这说明依靠地址找到存放在地点,根据类型找到存放位置,按随用随分配,不用立即让出,以是否工作确定是否分配空间,说明根据地址及指向变量类型确定首个对象就是存取对象,因此指针变量既要地址及指向对象的类型。若有int型变量a和float型变量b,如先后把它们分配在2000开始的存储单元中,&a和&b的信息是不相同的,虽然存储单元的地址编号相同,但它们的数据类型不同,存取编号地址相同,但是存取位置小地点(存储单元内容类型)是不同的。
4、区分数据类型的本质作用,是为了合理的利用内存空间。基本类型:char,short,int,long,float,double,char占用1个字节空间charch;printf(nsizeof(ch)=%dn”,sizeof(ch);/ch占一个字节intnum;printf(sizeof(num)=%dn”,sizeof(num);/4个字节IByte存放8位二进制位Ibit只能存放0或1指针变量:编号(地址):内存中每一个字节分配一个编码,定义一个变量存放上面的号码这样的变量叫做指针变量。存储单元的地址和存储单元的内容是有区别,假设程序已定义了3个整型变量iJA,在程序编译时,系统可能分配
5、地址为2000-2003的4个字节给变量i,20042007的4个字节给j,20082011的4个字节给k(不同的编译系统在不同次的编译中,分配给变量的存储单元的地址更是不相同的,因为随用随分配,用完即让出空间)。在程序中一般是通过变量名来引用变量的值,这里指输出。例如:printf(%dnzi);由于在编译时,系统已为变量i分配了按整型存储方式的4个字节,并建立了变量名和地址的对应表,因此在执行上面语句时,首先通过变量名找到相应的地址,从该4个字节中按照整型数据的存储方式读出整型变量i的值,然后按十进制整数格式输出。注意:对变量的访问(这里指录入数据,输入变量值对应地址,直接存入数据到对应地
6、址)都是通过地址进行的。假如有输入语句scant(,%dnz&i);在执行时,把键盘输入的值送到地址为2000开始的整型存储单元中。如果有语句k=i+j;则从20002003字节取出i的值(如i=3),再从20042007字节取出j的值(如j=6),将它们相加后再将其和(k=9)送到k所占用的20082011字节单元中。这种直接按变量名进行的访问,称为直接访问方式。还可以采用另一种称为间接访问的方式,即将变量i的地址存放在另一地址变量中,然后通过该地址变量来找到变量i的地址,从而访问i变量。在C语言程序中,可以定义整型变量、浮点型(实型)变量、字符变量等,也可以定义一种特殊的变量,用它存放地址
7、。假设定义了一个变量LPointer(变量名可任意取),用来存放整型变量的地址。可以通过下面语句将i的地址(2000)存放到Lpointer中。将i的地址存放到Lpointer中LPointer=&i;(把对应地址赋值给地址变量,不是指针变量,是专门存地址编号的变量,类似普通变量,未赋值*p的指针变量P=&i,是间接访问。这时,Jpointer的值就是2000(即变量i所占用单元的起始地址,变量占4字节)。根据存储空间编号起始址加上类型决定的长度,间接存取指定变量。voidtest()intnum=100;取变量的地址用&/&num代表标量num的起始地址int*pPrintf(“pn”,&n
8、um);定义一个指针变量,保存num的地址在定义的时候:*说明p是指针变量,而不是普通变量int*p=null;printf(nsizeof(p)=dnn,sizeof(p);/num的地址与p建立关系p=#printf(nnum=dnnznum);使用中;*P表示取P保存的地址编号对应空间的内容printf(,p=dn,*p);/100要存取变量i的值,既可以用直接访问的方式,也可以采用间接访问的方式:先找到存放变量i的地址的变量Lpointerz从中取出i的地址(2000)z然后到2000字节开始的存储单元中取出i的值。直接访问:根据变量名直接向变量i赋值,由于变量名与变量的地址有
9、一一对应的关系,因此就按此地址直接对变量i的存储单元进行访问(如把数值3存放到变量i的存储单元中)。i=3;间接访问:先找到存放变量i地址的变量Lpointer,从其中得到变量i的地址(2000),从而找到变量i的存储单元,然后对它进行存取访问。为了表示将数值3送到变量中,可以有两种表达方法:Q)将3直接送到变量i所标识的单元中,例如i=3;。(2)将3送到变量LPointer所指向的单元(即变量i的存储单元),例如*i_pointer=3;”,其中*i_pointer表示LPointer指向的对象。指向就是通过地址来体现的。假设LPointer中的值是变量i的地址(起始地址编号为2000),
10、这样就在Lpointer和变量i之间建立起一种联系,即通过i_pointer能知道i的地址,从而找到变量i的内存单元。由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元。将地址形象化地称为指针。意思是通过它能找到以它为地址的内存单元(如同根据地址2000就能找到变量i的存储单元一样)。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为指针变量。上述的ipointer就是一个指针变量。指针变量就是地址变量,用来存放地址,指针变量的值是地址(即指针)。区分指针和指针变量这两个概念。例如,可以说变量i的指针是2000,而不能说i的指针变量是2000o指针是一个地址(起始地址编号)
11、,而指针变量是存放地址的变量。2指针变量存放地址的变量是指针变量,它用来指向另一个对象(如变量、数组、函数等)。内存区的每一个字节都有一个编号,这就是地址。指针的实质就是内存地址。指针就是地址,地址就是指针。指针是内存单元的编号,指针变量是存放地址的变量任意类型的指针在32位平台都是4字节(32位)。2.1 定义和使用指针变量例:通过指针变量访问(提取)整型变量。先定义2个整型变量,再定义2个指针变量分别指向这两个整型变量,通过访问指针变量,可以找到它们所指向的变量,再提取这些变量的值。编写程序:#includeintmai()inta=100zb=10;int*pointer_l,point
12、er_2;pointer_1=&a;pointer_2=&b;printf(a=%dzb=%dn,zazb);printf(pointer_1=%d,pointer_2=%dn,*pointer_l,*pointer_2);定义整型变量a,b,并初始化定义指向整型数据的指针变量pointer_1/pointer_2把变量a的地址赋给指针变量pointer_1把变量b的地址赋给指针变量pointer_2输出变量a和b的值输出变量a和b的值return0;运行结果:a=100,b=10*pointer_1=100/*pointer_2=10;(1)在开头处定义了两个整型指针变量*pointer和*
13、pointer_2。规定它们可以指向整型变量,至于指向哪一个整型变量,要在程序语句中指定。使PointerjL指向a,pointer_2指向b,止匕时POinterjL的值为&a,pointer_2的值为&bo(2)输出变量a和b的值100和IOo输出*pointer_1和*pointer_2的值。其中的表示向。*pointer_1表示指针变量pointer_1所指向的变量,也就是变量aopointer_2表示指针变量Pointer2所指向的变量,也就是变量bo从运行结果看到,它们的值也是Ioo和IOo(3)程序中有两处出现pointer_1和pointer_2,二者的含义不同。*pointe
14、r_1和*pointer_2表示定义两个指针变量,变量名为PointerJL和pointer_2O它们前面的*只是表示该变量是指针变量。程序最后一行printf函数中的*pointerJL和*pointer_2则代表指针变量pointer_l和pointer_2所指向的变量。定义指针变量时,左侧应有类型名,否则就不是定义指针变量。如:int*pointer_1;2.2 怎样定义指针变量定义指针变量的一般形式为类型名*指针变量名;如:int*pointer_1,*pointer_2;左端的int是在定义指针变量时必须指定的基类型。指针变量的基类型用来指定此指针变量可以指向的变量的类型,并不是地址
15、类型例如,上面定义的基类型为int的指针变量PointerJL和pointer_2,可以用来指向整型的变量i和j,但不能指向浮点型变量a和b。基本的数据类型如int,charrfloat等,既然有这些类型的变量,就可以有指向这些类型变量的指针,因此,指针变量是基本数据类型派生出来的类型,它不能离开基本类型而独立存在。下面都是合法的定义:float*pointer_3;char*pointer_4;可以在定义指针变量时,同时对它初始化,一般不在定义时赋值。如:int*pointer_1=&a/pointer_2=&b;上面程序应改写成int*pointer_1/pointer_2;pointer_1=&a;因为a的地址是赋给指针变量名为PointerJL,而不是把a地址赋给pointer(相当变量a本身)。说明:在定义指针变量时要注意:(1)指针变量前面的表示该变量为指针型变量。指针变量名是pointer_1和pointer_2,而不是*pointer_1和着*pointer_2O这是与定义整型或实型变量的形式不同的。(2)在定义指针变量时必须