《程序设计(c语言)》由会员分享,可在线阅读,更多相关《程序设计(c语言)(66页珍藏版)》请在金锄头文库上搜索。
1、第8章 指针,1.存储单元:构成存储单元的基本单位是字节,不同类型的存储单元由数量不等的连续字节组成,计算机给每个字节一个惟一的编号。 2.指针:构成某一存储单元的连续字节的起始字节编号称为该存储单元的地址,也称为该存储单元对应变量的指针。即:变量的指针就是变量的地址,8.1.1 指针的概念,如果有:int a=5;则内存情况如图8-1所示。 a是存储单元(即变量)的名字, 5是存放在存储单元中的内容, 存储单元的地址是2000。,图8-1,8.1.2 指针变量,指针变量:存放某一变量的地址的变量称为指针变量。 指针变量的一般定义形式如下: 类型标识符 *标识符; 例:int *p; 允许指针
2、变量在定义中初始化。 例如:int a=5,*p= /*&a 是变量a的地址*/ 其示意图如图所示(图2): 注意:此语句是将&a赋给p,而不是*p。,int a=5,*p=,图8-2,8.1.3 指针变量的运算,1赋值运算 不能直接给一个指针变量赋一个整数 变量的地址是通过对变量取地址运算得到的。 &变量名 “&”是对变量取地址运算符,其作用是取得变量所占用的存储单元的地址(构成存储单元的连续字节的首字节编号)。,8.1.3 指针变量的运算,对指针变量的赋值是将另一变量的地址赋给指针变量。其一般格式有如下四种: 指针变量名=&变量名 指针变量名=指针变量名 指针变量名=指针变量名+整型数据值
3、 指针变量名=指针变量名-整型数据值,8.1.3 指针变量的运算,例如: int a,i=1; int *p,*q,*m,*n; p=,8.1.3 指针变量的运算,2取指针变量指向的存储单元(或变量)运算 *指针数据值 如果有: int a; int *p; p= 则:* p与a是相同的,表示同一个变量。,可以是常量、变量或表达式,8.1.3 指针变量的运算,“ 则:指针变量p指向变量a;*p(即a)的值赋给b,b的值为3;将5赋给*p(即a),a的值为5。,8.1.3 指针变量的运算,3比较运算 当两个基类型相同的指针变量已被正确赋值后,可以对指针变量的值进行比较运算。 如果有: int a
4、6; int *p,*q; p= 指针变量p、q的指向如图8-4所示。 此时,对p、q进行比较运算,则有: pq、p=q、p= =q的值为假; pq、p=q、p!=q的值为真。,图8-4,8.1.3 指针变量的运算,4减法运算 两个指针变量在一定条件下,可进行减法运算。 设p, q指向同一数组,则p-q的绝对值表示p所指对象与q所指对象之间的元素个数。,如果有:char a10=“Hello“; char *p,*q; int n; p= 指针变量p、q的指向 如图8-5所示,则:n=5。,图8-5,8.1.3 指针变量的运算,8.1.3 指针变量的运算,5指针变量的运算应用举例 例8.1 输
5、入a和b两个整数,按先大后小的顺序输出a和b。 #include main() int *p1,*p2,*p,a,b; scanf(“%d,%d“, ,8.2.1 指针与一维数组,一、一维数组与指针 定义一维数组与指针。 例:int a5,*p; 则a为首地址常量,其对象类型为int * ; a值与 则p0a2,p1a3,二、应用举例 例8.2 用不同的方法对有10个元素的整型数组进行输入输出。 方法一:下标法。p+ *p+,8.2.1 指针与一维数组,p+; /* 相当于p=p+1; */ 特殊表达式: *p+; 和 *p-; 先取用对象(*p),然后p自加减1 +*p;与 *+p; 完全相
6、同 -*p;与*-p;完全相同 , 这四种形式都是p先自加减1,然后再取用对象,等价于*(p+) 不等价于(*p)+,注意:,8.3.2 指针与二维数组,一、二维数组与指针 例 int b35; 可理解为:b是数组名.b是数组首地址. b数组包含三个元素:b0,b1,b2; 而每个元素又是一个一维数组. 则:b &b0 表数组首地址. *b b0 &b00 代表数组首元素地址. *(b+i) bi &bi0 代表第i行0列元素的地址.,注:数组首地址值:b=*b=b0=&b0=&b00 第i行首地址 : b+i=*(b+i)=bi=&bi=&bi0,二维数组与一级指针变量 int b35,*p
7、; 一般给p赋初值为数组首元素地址: p= 则bij可用指针表示为:*(p+5*i+j) 或p5*i+j,列数,p+5,例8.3 用指向二维数组元素的指针变量处理二维数组的输入输出。 程序一: #include main() int a34; int *p,i,j; p=a0; for(i=0;i3;i+) for(j=0;j4;j+) scanf(“%d“, (p+i*4+j); for(i=0;i3;i+) for(j=0;j4;j+) printf(“%4d“,*(p+i*4+j); printf(“n“); ,8.3.2 指针与二维数组,程序二: #include main() int
8、 a34; int *p,i,j; for(p=a0;pa0+12;p+) scanf(“%d“, p); for(p=a0;pa0+12;p+) if(p-a0)%4= =0) printf(“n“); printf(“%4d“,*p); ,8.3.2 指针与二维数组,(2)指向一个由n个元素组成的一维数组的指针变量。 又称行指针变量,或数组指针。 其定义形式如下: 类型说明符 (*p)n; 说明: 1)类型说明符是指向一维数组元素的类型。 2)该语句定义了一个指针变量p。 3)指针变量p的基类型是由n个元素组成的一维数组类型。,行指针变量与二维数组,(二)二维数组与行指针 例:int b3
9、5; int (*p)5; 则:b是可以看作是一个二级指针常量; p是可以看作是一个二级指针变量; 通常给p赋值为:p=b或p=b+i 则p每增1是移动到下一行。 则:bij的地址:*(b+i)+j =bi+j =pi+j =&pij=&bij=*(p+i)+j,列数,行指针变量与二维数组,例8.4 用指向一维数组的指针变量处理二维数组的输入输出。 程序一: #include main() int a34; int (*p)4,i,j; p=a; for(i=0;i3;i+) for(j=0;j4;j+) scanf(“%d“, (*(p+i)+j); for(i=0;i3;i+) for(j
10、=0;j4;j+) printf(“%4d“,*(*(p+i)+j); printf(“n“); ,程序二: #include main() int a34; int (*p)4,i,j; p=a; for(i=0;i3;i+) for(j=0;j4;j+) scanf(“%d“, (pi+j); for(i=0;i3;i+) for(j=0;j4;j+) printf(“%4d“,pij); printf(“n“); ,行指针变量与二维数组,8.3.3 指针数组,数组元素为指针类型的数组称为指针数组。 指针数组的定义形式如下: 类型说明符 *标识符常量表达式; 如果有:int *q3; 则指
11、针数组q可以用图8-14所示,图8-14,说明: (1)类型说明符是数组元素存储的地址的基类型。 (2)“*”表示数组的元素值是地址,即元素类型为指针类型。 (3)标识符是指针数组的名字。 (4)常量表达式表示指针数组的大小。,使用指针数组来处理二维数组。,例如:如果有: int a34; int *b3,i,j; for(i=0;i3;i+) bi=ai; 则有如图8-15所示的存储关系。,图8-15,此时,二维数组a中任一元素aij的地址可用指针数组b表示如下: bi+j *(b+i)+j 相应地,二维数组a中任一元素aij可用指针数组b表示为: *( bi+j) bij *(*(b+i)
12、+j) *(b+i)j,注意: (1)从以上用指针数组表示二维数组的形式看,其用法与用数组指针(指向一维数组的指针)相似,但要注意两者的概念是不同的,指针数组是由多个元素组成的,即有多个变量,指针数组名是一个地址常量,而数组指针是指向一维数组的指针,是一个变量。 (2)指针数组和数组指针的定义形式是不同的:int *p3;定义p是一个指针数组; int (*p)3;定义p是一个数组指针。,指针数组与数组指针,用指针数组处理二维数组。,例8.5 用指针数组处理二维数组。 #include main() int a34=1,3,5,7,9,11,2,4,6,8,10,12; int *b3,i,j
13、; for(i=0;i3;i+) bi=ai; for(i=0;i3;i+) for(j=0;j4;j+) printf(“%4d“, bij); printf(“n“); ,8.3.4 指针与字符串,一用字符指针表示字符串 字符指针的定义: char *字符指针变量名; 例1:#include main() char *str=“I am happy”; printf(“%s”,str); ,str,二、 字符数组与指针变量 1. 赋初值 static char str=”I love china!”;(静态或外部类) char *a=”I love china!”;(不必要求为静态或外部类
14、) 2. 赋值 char *a; a=”I love china!”;(正确) char str14; str=”I love china!”(错误) 3. 输入字符串 char str10; scanf(“%s”,str); 或gets(str);(正确) char *a; scanf(“%s”,a); (错误),8.3.4 指针与字符串,用指针输入字符串正确的做法应是: char str10; char *a; a=str; scanf(“%s”,a); gets(a); 或 a=(char *)malloc(10); scanf(“%s”,a);,8.3.4 指针与字符串,输出字符串 c
15、har *s=”I am a student”; puts(s); 或printf(“%sn”,s); char str=”I am a student!”; puts(str); 或printf(“%sn”,str);,8.3.4 指针与字符串,3用字符指针处理字符串应用举例 例8.6 将字符串s1从第m个字符开始剩余的所有字符送入到另一个字符串中。 #include main() int m; char s180,s280,*p,*q; printf(“input a string:n“); gets(s1); printf(“input start point:n“); scanf(“%d“, ,8.3.4 指针与字符串,例8.7 利用字符指针数组输出多个字符串。 #include main() char *s4; int i; s0=“China“; s1=“Shanghai“; s2=“Beijin“;