5.1 指针和指针变量 指针是轨范设计说话的一个主要概念。指针在C轨范中有以下多方面的浸染:
+ l: P, E* s4 _1 C (1)操作指针能借居引用它所指的对象。
, V# T9 q' ?8 d, s% K (2)操作各类类型的指针形式参数,能使函数增添描述能力。6 Z9 y# n* `4 h( u
(3)指针与数组连系,使引用数组元素的形式加倍多样、访谒数组元素的手段加倍矫捷。+ l' F/ d* x9 b% W# M2 F. T1 X
(4)指针能用来描述数据和数据之间的关系,以便机关复杂的数据结构。当一个数据A要联系关系另一个数据B时,在数据A中增添一个指向数据B的指针就可实现数据A联系关系数据B。连系系统供给的动态分配存储行动措施,又能机关出各类动态数据结构。
$ N& n. w* K0 D: v0 \3 K1.指针的根基概念 6 A7 p x% f; u" ]9 R
为了区别内存的分歧位置,内存被分成字节,内存的全数字节挨次地赋予一个称为地址的编号。轨范中的变量将在内存中占有必然的内存字节,在这些字节中存储的数据信息称为变量的内容。一个变量占用持续的若干个内存字节时,最前面的一个字节的地址就作为该变量的地址。指针就是内存地址,是变量的地址,或函数的进口地纸怪虽量的地址在轨范执行时,起着很是主要的浸染。当计较机在计较含有变量的表达式时,计较机按变量的地址掏出其内容,并按变量的地址将计较结不美观存入到变量占有的内存中。如代码:
1 L/ x& W! U! c/ { int x=l;
$ x7 J2 o5 I5 A0 `; s x=x+2;
: y& Q, h( h+ r# _0 ` 其中语句“x=x+2;”中的第一个x涉及到变量x占有的内存,第二个 x是引用变量 x的内容。该语句的意义是“取X的内容,完成加上2的计较,并将计较结不美观存入变量X占有的内存中。”3 t! k. p' m1 f w$ a* R
2.指针变量和它所指向的变量
+ Z; w4 U' z5 u6 E9 A2 |) r 在C说话中,地址也作为一种值,能被存储、斗劲、赋值,并称地址数据为指针类型,而称存储地址值的变量为指针变量,简称指针。C轨范可用运算符&取变量的地址,如表达式&x的值就是变量X的地址。轨范除能按名引用变量外,也可操作变量的地址引用变量。按变量名引用变量称为直接引用,而将变量A的地址存于另一变量B中,借助于变量B引用变量A称为对A的借居引用。0 ^: o( ?) p6 L3 q# f
3.指针变安的界说、初始化和引用
- V% i) p/ v! m 指针变量用于存放某个变量的地址。界说指针变量的一般形式为:
' q5 b- X. I2 @* z* d- | 类型 * 指针变量名;
* b2 u2 P0 v9 |7 [, u6 s5 w, v 或
+ B; W0 q. j# L2 O 类型 * 指针变量名=初值表达式;
+ F9 b% ?* }+ g0 u 此鱿脯指针变量名是标识符,指针变量名之前的符号“*”,暗示该变量是指针类型的。而最前面的“类型”,暗示该指针变量能指向变量或函数的类型。初值表达式是一个地址表达式,如表达式中有某变量的地址表达式,则这个变量应是前面已界说的。
! ^- Q- e, n* `0 D1 e 在C说话中,当界说局部指针变量时,如未给它指定初值,则其值是不确定的。轨范在使用它们时,应首先给它们赋值。误用其值不确定的指针变量借居引用其它变量,会引起意想不到的错误。为明晰暗示指针变量不指向任何变量,在C语押朐睹0值暗示这种情形,记为NULL。如
6 u( y E! ~+ i1 E' I) H ip= NULL;
* n( {; V$ V7 |. U$ Q3 g5 m5 |# v 也称指针值为0的指针变量为空指针。对于静态的指针变量,如在界说时未给它指定初值,系统自动给它指定初值0。' Z& W2 q# f# I1 A! _9 k: u
指针变量取轨范对象的(起头)地址止墁不能将一个整型量或任何其它非地址值赋给一个指针变量。此外,指针变量对所指向的对象也有类型限制,不能将一个不能指向的对象的地址赋给指针变量。若有以下界说:, G3 W! O# `3 V9 d1 @
int i=100,j,*ip,*intpt;
2 u" ]$ W: ~9 d8 u* j float f,*fp;$ j X6 m$ I* v- |( t6 J$ Y
以下代码如注释所叙。
c% L% F9 Q1 e0 R. H iP=&i;/*使ip指向i*/
9 G) Y$ k+ ?& v! v. ^ intpt=ip;/*使intpt指向ip所指变量*/
- L& {. w, I5 K fp= &f;/*使fp指向正*/
# I3 u/ v. l9 R0 E; f ip=NULL;/*使 ip不再指向任何变量*/ |