第3章指针 本章介绍C语言程序设计的基本方法和 基本的程序语句。使读者对C程序有一个 初步的认识,为后面各章的学习打下基础。 5,1指针的概念 5.,2指针变量的定义与引用 5.3指针变量的运算 5.4指针与数组 5.5指针与字符串 5.6指针数组与指向指针的指针
第3章 指针 本章介绍C语言程序设计的基本方法和 基本的程序语句。使读者对C程序有一个 初步的认识, 为后面各章的学习打下基础。 5.1 指针的概念 5.2 指针变量的定义与引用 5.3 指针变量的运算 5.4 指针与数组 5.5指针与字符串 5.6 指针数组与指向指针的指针
51指针的概念 511变量的地址与变量的内容 不同类型的数据所占用的内存单元个数不等,如实型量占 4个单元,整型量占2个单元,字符型量占1个单元等。为了方 便对这些内存单元访间,每一个内存单元都有一个编号,根 据内存单元的编号即可准确地找到该内存单元,这个编号就 内存单元的地址。内存单元中存放的数据即为内存单元中 内容。 在程序中定义变量时,系统会自动按变量的类型为其分配 定长度的内存单元。 0000 0001 假设在程序中有如下语句: Int x,y,Z 300058 3001 X=58 00232 3003 xyz 32 3004 300 z三y 图5-1
5.1 指针的概念 5.1.1 变量的地址与变量的内容 不同类型的数据所占用的内存单元个数不等,如实型量占 4个单元,整型量占2个单元,字符型量占1个单元等。为了方 便对这些内存单元访问,每一个内存单元都有一个编号,根 据内存单元的编号即可准确地找到该内存单元,这个编号就 是内存单元的地址。内存单元中存放的数据即为内存单元中 的内容。 在程序中定义变量时,系统会自动按变量的类型为其分配 一定长度的内存单元。 假设在程序中有如下语句: int x,y,z; x = 58 y = 32 z = x + y
5.12直接访问与间接访问 所谓直接访问是指按变量名或地址来存取变量的 方式。 例如,对上例中的语句z=x+y;它的执行是 先从变量x的地址3000开始的两个单元中取出x的 内容,再从变量y的地址3002开始的两个单元中取 出y的内容,将它们相加后再送到变量z的地址 3004开始的两个单元中 既然根据内存单元的地址就可以找到所需的内存 单元,所以通常把地址形象地称为指针。可以通 过指针存取该单元中的数据 所谓间接访问是指用存储在一个变量中的地址去 访问这个地址所指示的内存单元的方式
5.1.2 直接访问与间接访问 所谓直接访问是指按变量名或地址来存取变量的 方式。 例如,对上例中的语句z = x + y;它的执行是 先从变量x的地址3000开始的两个单元中取出x的 内容,再从变量y的地址3002开始的两个单元中取 出y的内容,将它们相加后再送到变量z的地址 3004开始的两个单元中。 既然根据内存单元的地址就可以找到所需的内存 单元,所以通常把地址形象地称为指针。可以通 过指针存取该单元中的数据。 所谓间接访问是指用存储在一个变量中的地址去 访问这个地址所指示的内存单元的方式
在计算机中,地址实际上也是数据(如3001, 3002等),所以地址也可以作为存储单元的内容存 放在一个变量中,用来存放指针数据的变量叫做指 针变量。一个指针变量的值就是某个内存单元的地 址或称为某内存单元的指针。 例如图5-1中,变量x的内容为58,占用了从地 址3000开始的两个连续存储单元。假设又定义了 个变量P,假若P的值为3000,也就是说,P的内容 为x的地址。如图5-2所示。 我们专门定义了一个变量p用来存放另一个变量 的地址,以后如果我们要访问变量x的内容,可以 不通过x直接访问,而是通过通过变量p,用变量p 内的地址间接地去访问变量x,这种访问方式就称 为间接访问
在计算机中,地址实际上也是数据(如3001, 3002等),所以地址也可以作为存储单元的内容存 放在一个变量中,用来存放指针数据的变量叫做指 针变量。一个指针变量的值就是某个内存单元的地 址或称为某内存单元的指针。 例如图5-1中,变量x的内容为58,占用了从地 址3000开始的两个连续存储单元。假设又定义了一 个变量P,假若P的值为3000,也就是说,P的内容 为x的地址。如图5-2所示。 我们专门定义了一个变量p用来存放另一个变量 的地址,以后如果我们要访问变量x的内容,可以 不通过x直接访问,而是通过通过变量p,用变量p 内的地址间接地去访问变量x,这种访问方式就称 为间接访问
5.13指针与指针变量 综前所述,对内存单元的访问是通过地址来实现的。 在C语言中把地址形象地称为指针。变量对应的地址 称为变量的指针。例如,在图5-1中,变量x的指针 为3000,变量y的指针为3002。 严格地说,指针为地址,是常量。而指针变量却可 以被赋予不同的指针值,是变量。但常把指针变量 简称为指针。为了避免混淆,我们中约定:“指针” 是指地址,是常量,“指针变量”是指取值为地址 的变量。 定义指针的目的是为了通过指针去访问内存单元
5.1.3 指针与指针变量 综前所述,对内存单元的访问是通过地址来实现的。 在C语言中把地址形象地称为指针。变量对应的地址 称为变量的指针。例如,在图5-1中,变量x的指针 为3000,变量y的指针为3002。 严格地说,指针为地址,是常量。而指针变量却可 以被赋予不同的指针值,是变量。但常把指针变量 简称为指针。为了避免混淆,我们中约定:“指针” 是指地址,是常量, “指针变量”是指取值为地址 的变量。 定义指针的目的是为了通过指针去访问内存单元
52指针变量的定义与引用 52.1指针变量的定义 指针变量定义的一般形式为: 类型名来指针变量名 其中“类型名”表示指针变量所指向的变量的类 型,“米”表示定义的是指针变量。 例如: int xpl 注意,一个指针变量只能指向同一类型的数据 指针变量同普通变量一样,具有变量类型、变量名、 变量值三要素,但是,指针变量存放的是所指向的某 个变量的地址值,并且只能是类型说明所规定的变量 类型的地址。而普通变量存放的是该变量本身的值
5.2 指针变量的定义与引用 5.2.1指针变量的定义 指针变量定义的一般形式为: 类型名 *指针变量名 其中“类型名”表示指针变量所指向的变量的类 型, “*”表示定义的是指针变量。 例如: int *p1; 注意,一个指针变量只能指向同一类型的数据。 指针变量同普通变量一样,具有变量类型、变量名、 变量值三要素,但是,指针变量存放的是所指向的某 个变量的地址值,并且只能是类型说明所规定的变量 类型的地址。而普通变量存放的是该变量本身的值
522指针变量的引用 1指针变量的初始化 指针变量中只能存放地址,不能将一个整型量(或任何其它非 地址类型的数据)赋 运 ,卺的作用是取量所罟角的丙存单芫的蓄地址。萁 般形式为: &变量名 如&x表示取变量x的地址,&y表示取变量y的地址。 图52例如,以下定义表示将指针变量p初始化为变量x的地址。参考 intx: int *p=&x; X=100; 注意: 变量x的类型必须和指针变量p的类型一致,例如以下定 义是非法的。 float y int xp=&y 因为p为整型指针变量,y为实型变量,类型不一致
5.2.2 指针变量的引用 1.指针变量的初始化 指针变量中只能存放地址,不能将一个整型量(或任何其它非 地址类型的数据)赋给一个指针变量。为此,C语言提供了取地址 运算符“&” ,它的作用是取变量所占用的内存单元的首地址。其一 般形式为: &变量名; 如&x表示取变量x的地址,&y表示取变量y的地址。 例如,以下定义表示将指针变量p初始化为变量x的地址。参考 图5-3。 int x; int *p = &x; x = 100; 注意: (1)变量x的类型必须和指针变量p的类型一致,例如以下定 义是非法的。 float y; int *p = &y; 因为p为整型指针变量,y为实型变量,类型不一致
2)不允许把一个指针变量初始化为一个常数,下面的 对指针变量p初始化也是非法的 int*p=1000; 以上是在定义指针变量的同时对其进行了初始化,也可以 先定乂指针变量,然后再通过赋值的方式对其初始化,例 如 intx int *p; p=&x; 注意,被赋值的指针变量前不能再加“*”说明符,如写 p=& X;定 还可以将指针变量初始化为空值NUL。例如: NULL 这时p初始化为一个空值,表示它不指向任何内存单元
(2)不允许把一个指针变量初始化为一个常数,下面的 对指针变量p初始化也是非法的。 int *p = 1000; 以上是在定义指针变量的同时对其进行了初始化,也可以 先定义指针变量,然后再通过赋值的方式对其初始化,例 如: int x; int *p; p= &x; 注意,被赋值的指针变量前不能再加“*”说明符,如写 为 *p = &x;是非法的。 还可以将指针变量初始化为空值NULL。例如: p = NULL; 这时p初始化为一个空值,表示它不指向任何内存单元
2使用指针访问变量 C语言提供了指针运算符“*”(也称间接访问 运算符) “*”作为运算符在表达式中出现 作用于指针变量上时,用来表示指针变量所指的 变量,含义是取出指针变量地址中存放的内容。 需要注意的是指针运算符“*”和指针变量说明 中的指钍类型名中的“米”不是一回事。在指钍 变量说明中,“*”是类型名,表示其后的变量 是指针类型。而表达式中出现的“米”则是 指针运算符用以表示指针变量所指的变量。 例如,假设有以下定义 int i=200. X. int *kip; p=&i
2.使用指针访问变量 C语言提供了指针运算符“*”(也称间接访问 运算符),当“*”作为运算符在表达式中出现, 作用于指针变量上时,用来表示指针变量所指的 变量,含义是取出指针变量地址中存放的内容。 需要注意的是指针运算符“*”和指针变量说明 中的指针类型名中的“*”不是一回事。在指针 变量说明中, “*”是类型名,表示其后的变量 是指针类型。而表达式中出现的“*”则是一个 指针运算符用以表示指针变量所指的变量。 例如,假设有以下定义: int i=200, x; int *ip; ip = &i;
执行语句ip=&i;此时指针变量ip指向整 型变量以后便可以通过指针变量i间 接访变量i了,例如执行语句 X=*1p; 因为运算符“米”访问以i为地址的存贮区 域,而i中存放的是变量i的地址,因此 i表示访问变量i的地址所占用的存贮 区域,所以上面的赋值表达式等价于x i;所以x的值为200。。 【例5.1】通过指针访问整型变量 【例5.2】求两个数的和、差与积 【例5.3】输入三个数,求最大和最小值
执行语句ip = &i; 此时指针变量ip指向整 型变量i, 以后便可以通过指针变量ip间 接访问变量i了,例如执行语句: x = *ip; 因为运算符“*”访问以ip为地址的存贮区 域,而ip中存放的是变量i的地址, 因此, *ip表示访问变量i的地址所占用的存贮 区域, 所以上面的赋值表达式等价于 x = i; 所以x的值为200。。 • 【例5.1】通过指针访问整型变量。 • 【例5.2】求两个数的和、差与积。 • 【例5.3】输入三个数,求最大和最小值。 •