第9章_指针(一)_第1页
第9章_指针(一)_第2页
第9章_指针(一)_第3页
第9章_指针(一)_第4页
第9章_指针(一)_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 9.1 9.1 指针与指针变量的概念指针与指针变量的概念 9.2 9.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 9.3 9.3 数组的指针与指向数组的指针变量数组的指针与指向数组的指针变量 9.4 9.4 字符串的指针与指向字符串的指针变量字符串的指针与指向字符串的指针变量9.1.1 指针的引入示例指针的引入示例#include void main() int hour,minute,second; int *phour,*pminute,*psecond; /定义了三个指针类型的变量定义了三个指针类型的变量 printf(“请输入小时,分,秒请输入小时,分,秒:”)

2、; scanf(“%d%d%d”,&hour,&minute,&second); printf(“以普通方式输出的时间是以普通方式输出的时间是:%d:%d:%dn”, hour,minute,second); phour=&hour; /给指针变量给指针变量phour赋值赋值 pminute=&minute; /给指针变量给指针变量pminute赋值赋值 psecond=&second; /给指针变量给指针变量psecond赋值赋值 printf(“以指针方式输出的时间是以指针方式输出的时间是:%d:%d:%dn”, *phour,*pminute,*psecond); return;注意这三

3、个变量的定义形式注意这三个变量的定义形式 9.1 地址和指针变量的概念地址和指针变量的概念输出结果:输出结果: 内存中每个字节有一个编号,就是内存中每个字节有一个编号,就是“地址地址” 。如在程序中定义了变量,在对程序进行编译时,系如在程序中定义了变量,在对程序进行编译时,系统就会给这个变量分配内存单元。统就会给这个变量分配内存单元。 例如有程序段:例如有程序段: short x,y,z; x=3; y=4; z=x+y;9.1.2 指针和指针变量的概念指针和指针变量的概念 内存中分配内存中分配1000H开开始的始的2个字节给变量个字节给变量x,分,分配配1002H开始的开始的2个字节给个字节

4、给变量变量y,分配,分配1004H开始的开始的2个字节给变量个字节给变量z 。 有语句有语句pointer=&x; 内其中内其中&为取地址运算符,通过该运算符获取变量为取地址运算符,通过该运算符获取变量x的指针,该语句将的指针,该语句将x的地址赋给特殊的变量的地址赋给特殊的变量pointer。 “指针指针”就是具有某种数据类型的存储单元的地址就是具有某种数据类型的存储单元的地址 。例如,地址例如,地址1000H是上述变量是上述变量x的指针。的指针。如果有一个变量专门用来存放另一变量的地址(即如果有一个变量专门用来存放另一变量的地址(即指针),则它称为指针),则它称为“指针变量指针变量”。如上述

5、的如上述的pointer就是一个指针变量,此处存储了变就是一个指针变量,此处存储了变量量x的地址。的地址。指针和指针变量的定义:指针和指针变量的定义:9.2 变量的指针和指向变量的指针变量的指针和指向变量的指针变量变量9.2.1 变量的指针变量的指针 变量的指针是指变量在内存中所分配的变量的指针是指变量在内存中所分配的具有某种数据类型的存储单元的地址。具有某种数据类型的存储单元的地址。 常量、普通表达式以及寄存器变量等没常量、普通表达式以及寄存器变量等没有指针的概念有指针的概念 ,而,而&3、&(x+5)等都是非法的。等都是非法的。9.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指

6、针变量9.2.2 指向变量的指针变量指向变量的指针变量定义指针变量的形式:定义指针变量的形式: 类型标示符类型标示符 *指针变量名;指针变量名;合法的定义:合法的定义: float *pointer_; char *pointer_; 可用赋值语句使一个指针变量得到另一个变可用赋值语句使一个指针变量得到另一个变量的地址,使它指向一个该变量。量的地址,使它指向一个该变量。例如:例如:int i,j,* pointer_, *pointer_2;pointer_;pointer_;几点说明:几点说明:(1)变量名前面的符号变量名前面的符号“*”仅表示所定义的变量是指针变仅表示所定义的变量是指针变量

7、,它不是变量名的构成部分。量,它不是变量名的构成部分。例例: float *pointer_1; /*指针变量名是指针变量名是pointer_1 。*/ (2)指针变量定义后,它并没有明确指向任何变量,只指针变量定义后,它并没有明确指向任何变量,只有在给所定义的指针变量赋值有在给所定义的指针变量赋值(赋指针赋指针)时,指针变量时,指针变量才明确指向某变量才明确指向某变量 。如如: int *pointer,x; /定义指向整型变量的指针变量定义指向整型变量的指针变量 /pointer和整型变量和整型变量x x=3; pointer=&x; /使指针变量使指针变量pointer指向变量指向变量x

8、注意此处的注意此处的&不能少,表不能少,表示取变量示取变量x的地址的地址(3) 指针变量的类型一方面是用来说明该变量是指针变指针变量的类型一方面是用来说明该变量是指针变量,量,另一方面是用来说明该指针变量可以指向的变另一方面是用来说明该指针变量可以指向的变量的类型量的类型 。例如代码段:例如代码段: int a=10; float *p=&a; printf(“%f”,*p); 运行的结果是运行的结果是0.000000,而不是,而不是10.00000。此处指针变量此处指针变量p的指向类型的指向类型和变量和变量a的类型不一致的类型不一致9.2.3 9.2.3 指针变量的引用指针变量的引用 注意注

9、意:指针变量中只能存放地址(指针),不能将指针变量中只能存放地址(指针),不能将一个整数(或任何其他非地址类型的数据)赋给一个整数(或任何其他非地址类型的数据)赋给一个指针变量。一个指针变量。 相关运算符:相关运算符: & :取地址运算符;:取地址运算符; * :指针运算符,取其指向的内容。:指针运算符,取其指向的内容。例如例如: &a为变量为变量a的地址,的地址, *p表示指针变量表示指针变量p所指向的变量所指向的变量 例例9.2:通过指针变量访问整型变量通过指针变量访问整型变量#include voidmain ( ) int ,;,; int *pointer_, *pointer_;

10、=100;=10; pointer_=a; /把变量的地址赋给把变量的地址赋给pointer_1 pointer_=b; /把变量的地址赋给把变量的地址赋给pointer_ printf(“%d,%d ”,);); printf(“ %d ,%d ”,*pointer_, *pointer_);); 输出结果:输出结果:说明:说明: 执行语句执行语句 pointer_=a;(1)* pointer_的含义是什么?的含义是什么? “”和和“*” 的优先级别相同,但按自右而左方的优先级别相同,但按自右而左方向结合。向结合。* pointer_与相同,即变量与相同,即变量a的地址。的地址。 如果有如

11、果有pointer_2 * pointer_ ;它的作用是;它的作用是将将(的地址的地址)赋给赋给pointer_2 ,如,如pointer_2原来原来指向,经过重新赋值后它指向指向,经过重新赋值后它指向。(2) *的含义是什么?的含义是什么? 先进行运算,得的地址,再进行先进行运算,得的地址,再进行*运算。运算。*和和*pointer_的作用一样,都等价于变量。的作用一样,都等价于变量。即即*与等价。与等价。(3) (*pointer_)相当于。)相当于。例例9.3: 输入和两个整数,按先大后小的顺序输出。输入和两个整数,按先大后小的顺序输出。#include void main()() i

12、nt *p1, *p2, *p,a,b ; scanf(%d,%d,&a,&b) ; p1=&a; p2=&b; if (ab) p=p1; p1=p2; p2=p; printf(a=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2); return; 运行情况如下:运行情况如下:, ,当输入,时,由于,当输入,时,由于,将和交换。交换前的情况见图将和交换。交换前的情况见图(),交换后见图()。(),交换后见图()。思考:通过指针真正交换变量思考:通过指针真正交换变量a和和b的值的值?9.2.4 9.2.4 指针变量作为函数参数指针变量作为函数参数例例

13、9.4 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出 #include void main( ) void swap(int *p1,int *p2);int a,b;int *pointer_1, *pointer_2; scanf(“%d, %d”, &a, &b);pointer_1=&a; pointer_2 =&b; printf(“before swapping a=%d, b=%dn”,a,b); if(ab) swap( pointer_1,pointer_2);printf(after swapping a=%d, b=%dn, a, b); void swa

14、p(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp;若将若将swap函数做如下修改,函数做如下修改,请思考输出结果?请思考输出结果?void swap(int *p1,int *p2) int *temp; temp=p1; p1=p2; p2=temp;输出结果:输出结果:例例9.5 输入、输入、 3个整数,按大小顺序输出。个整数,按大小顺序输出。void swap (int *pt1,int *pt2) int p; p=*pt1; *pt1=*pt2; *pt2=p;void exchange(int *q1,int *q2,

15、 int *q3) if (*q1*q2)swap(q1,q2); if (*q1*q3)swap(q1,q3); if (*q2*q3)swap(q2,q3);#include void main( ) int a,b,c,*p1,*p2,*p3; printf(请输入请输入a,b,c的值的值:); scanf(%d,%d,%d,&a,&b,&c); p1=&a;p2=&b;p3=&c; exchange(p1,p2,p3); printf(交换后的序列为交换后的序列为:%d,%d,%dn,a,b,c); return;输出结果:输出结果:思考题:P168-169 一个数组包含若干元素,每个

16、数组元素在内一个数组包含若干元素,每个数组元素在内存中都占用存储单元,有相应的地址,存中都占用存储单元,有相应的地址,数组元素数组元素的地址也可称为数组元素的指针。的地址也可称为数组元素的指针。 指针变量既可指向变量,也可指向数组元素指针变量既可指向变量,也可指向数组元素(把某一元素的地址放到一个指针变量中)。(把某一元素的地址放到一个指针变量中)。 定义一个数组定义一个数组 例如:例如:intint a10 a10; C编译系统将为数组编译系统将为数组a的所有元素在内存中分配的所有元素在内存中分配一片连续的空间,数组名一片连续的空间,数组名a代表这片连续空间的起始代表这片连续空间的起始地址,

17、它也是第地址,它也是第0个数组元素的指针。个数组元素的指针。 数组名是一个指针,但不是指针变量,所以不能数组名是一个指针,但不是指针变量,所以不能对数组名赋值。对数组名赋值。 9.3.1 9.3.1 一维数组的指针与指向一维数组的指针变量一维数组的指针与指向一维数组的指针变量(1)一维数组的指针一维数组的指针数组的每一个元素也都有一个指针,数组名数组的每一个元素也都有一个指针,数组名a就是数就是数组第组第0个元素个元素a0的指针的指针&a0 ,a+i就是数组第就是数组第i个元个元素素ai的指针的指针&ai,如下图所示:,如下图所示:int型数组的每一个元素均相当于一个型数组的每一个元素均相当于

18、一个int型变量,因此型变量,因此int型的指针变量可以指向型的指针变量可以指向int型数组的任何一个元素型数组的任何一个元素 。 例如:例如: int *p,*q; p=a; q=&a4;执行上述三条语句后指针变量执行上述三条语句后指针变量p和和q的指向如上图所示。的指向如上图所示。 (2)指向一维数组的指针变量指向一维数组的指针变量对指针变量对指针变量p赋值:赋值:0;把把0元素的地址赋给指针变量,即指向数组元素的地址赋给指针变量,即指向数组的第号元素,如图:的第号元素,如图: 等价于:等价于:;数组名代表数组的首地址。数组名代表数组的首地址。 在定义指针变量时,可直接赋值:在定义指针变量

19、时,可直接赋值: intint * *; 0; 等价于:等价于: intint * *= =0; 或:或: intint * *= =; 将数组将数组a的首地址赋给指针变量的首地址赋给指针变量p,并不是赋给,并不是赋给* *,* *只是指明只是指明p p是一个指针变量。是一个指针变量。(3)通过指针引用数组元素通过指针引用数组元素 C规定:如果指针变量规定:如果指针变量p已指向数组中的一个元素,则已指向数组中的一个元素,则p+1指向数组中的下一个元素,而不是将指向数组中的下一个元素,而不是将p中的地址加中的地址加1。 intint * *= =; (或:(或:intint * *= =0) p

20、+; 表示表示p现在指向现在指向a1元素;元素; 问:问:p + i ? a + i ? 代表代表ai的地址,或指向的地址,或指向a数组中的第数组中的第i个元素。个元素。 *()或()或*()代表什么?()代表什么?代表代表 数组元素数组元素ai。 引用数组元素:引用数组元素:()() 下标法,如下标法,如ai或或pi形式;形式;()() 指针法,如指针法,如*(a+i)或或*(p+i)。 其中是数组名,是指向数组元素的指针变量,其中是数组名,是指向数组元素的指针变量,其初值。其初值。#include void main() int t,a10=0,1,2,3,4,5,6,7,8,9 ; in

21、t *begin,*end; begin=&a0; end=&a9; while (beginend) t=*begin; *begin=*end; *end=t; begin+; end-; begin=a; /使使begin重新指向第重新指向第0个元素个元素 while(begina+10) printf(%3d,*begin+); /输出输出begin 所指向元素的值所指向元素的值 printf(n); return;例例9.6 将数组中所有元素的值对称交换将数组中所有元素的值对称交换 输出结果:输出结果:(1) 下标法。下标法。#include void main()() int 10

22、; int ; for(=;10;+) scanf(%d,i);); printf(n);); for(=;10;+) printf( %d ,i );); 例例9.7 输出整型数组输出整型数组a中的全部元素。中的全部元素。 (2) 通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。#include voidmain()() int 10; int ; for(=;10;+) scanf(%d,i); printf(n); for(=;10;+) printf( %d ,*(+);(3) 用指针变量指向数组元素。用指针变量指向数组元素。#include voi

23、d main( ) int 10; int *,; for(=;10;+) scanf(%d,i);); printf(n);); for(=;(+10););+) printf( %d ,*);注意:注意:(1) p+ :使使p指向下一个元素。指向下一个元素。 *p :所指向的数组元素。所指向的数组元素。(2)*p+:优先级相同,自右向左。等价于优先级相同,自右向左。等价于*(p +),先执行先执行*p ,得到得到p指向的变量,然后指向的变量,然后p +1,指向下一元素。指向下一元素。(3)*(+p):先使先使p+1,再取,再取*p。(4)+(*p):p所指向的元素值加所指向的元素值加1。9

24、.3.2 9.3.2 一维数组的指针作函数参数一维数组的指针作函数参数 形参数组或形参指针变量所表示的形参数组或形参指针变量所表示的形参数组与实参数组共用形参数组与实参数组共用一段内存一段内存,在函数调用时,形参数组也没有分配新的存储单,在函数调用时,形参数组也没有分配新的存储单元,而是以实参数组的起始地址作为形参数组的起始地址元,而是以实参数组的起始地址作为形参数组的起始地址 ,也就是说,也就是说,形参数组的第形参数组的第i i个元素与实参数组的第个元素与实参数组的第i i个元素占个元素占用同一个存储单元用同一个存储单元,在函数调用过程中形参数组元素的值如,在函数调用过程中形参数组元素的值如

25、果发生了变化,也会使实参数组元素的值发生变化果发生了变化,也会使实参数组元素的值发生变化 可以用可以用一维数组名、一维数组第一维数组名、一维数组第0个元素的指针个元素的指针或指向数组的指针变量或指向数组的指针变量作为函数的实参。作为函数的实参。注意:用一维数组的指针作函数参数时,一定要注注意:用一维数组的指针作函数参数时,一定要注意形参与实参的类型要一致。意形参与实参的类型要一致。例例9.9 将数组中所有对称位置元素的值交换将数组中所有对称位置元素的值交换 #include #define N 10void exchange(int b) int t,*end=b+N-1; while (be

26、nd) t= *b; *b= *end; end=t; b+; /形参形参b是指针变量是指针变量,可以进行自增运算可以进行自增运算 end -; void main( ) int i,aN=0,1,2,3,4,5,6,7,8,9; printf(交换前的数组交换前的数组:nt); for (i=0;iN;i+) printf(%3d,ai); printf(n); exchange(a); printf(交换后的数组交换后的数组:nt); for (i=0; iN; i+) printf(%3d,ai); printf(n); return;输出结果:输出结果:此处仅传递数组名,也即数组的首地

27、址 实参数组名代表该数组首元素的地址,而形参实参数组名代表该数组首元素的地址,而形参是用来接收从实参传递过来的地址,所以,形参是一是用来接收从实参传递过来的地址,所以,形参是一个指针变量(只有指针变量才能存放地址)。个指针变量(只有指针变量才能存放地址)。 C编译都是将编译都是将形参数组名作为指针变量形参数组名作为指针变量来处理。来处理。 void (int arr,int ) 等价于:等价于: void (int *arr,int ) 函数被调用时,系统会建立一个指针变量函数被调用时,系统会建立一个指针变量arr,用来存放从实参传过来的数组首地址。用来存放从实参传过来的数组首地址。 arr指

28、向实参数组首元素,既指向实参数组首元素,既array0。 如果有个实参数组,想在函数中改变此数组中元素如果有个实参数组,想在函数中改变此数组中元素的值,实参与形参的对应关系有以下种情况:的值,实参与形参的对应关系有以下种情况: (1) 形参和实参都用数组名,如:形参和实参都用数组名,如:void main()() void f(int x, int n) int a10; f(a,10); (2) 实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:void main( ) void f(int *x,int n) int a10; f(a,10); (3)实参形参都用指针变量

29、。例如:实参形参都用指针变量。例如:void main()() void f(int *x,int n) int a10, *p=a; f(p,10); (4) 实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如: void main()() void f(int x ,int n) int a10 , *p=a ; f(p,10); 例例9.9 将两个升序数组归并成一个新的升序数组。将两个升序数组归并成一个新的升序数组。 #include#define M 10#define N 8void sort(int *x,int *y,int *z);void main()int

30、aM=0,1,3,8,8,25,30,36,40,50;int bN=-5,-1,2,5,25,32,35,38;int i,cM+N;printf(合并前数组合并前数组a:n);for (i=0;iM;i+) printf(%d ,ai);printf(n合并前数组合并前数组b:n);for (i=0;iN;i+) printf(%d ,bi);sort(a,b,c);printf(n合并后数组合并后数组c:n); for (i=0;iM+N;i+) printf(%d ,ci);return ;void sort(int *x,int *y,int *z)int i=0,j=0,k=0;w

31、hile (iM&jN) if (xi=yj) zk=xi;k+;i+; else zk=yj;k+;j+; while(iM) zk=xi;k+;i+; while (jN) zk=yj;k+;j+; return;9.3.3 9.3.3 二维数组的指针与指向二维数组的指针变量二维数组的指针与指向二维数组的指针变量 1. 二维数组元素的指针与指向二维数组元素的指针变量二维数组元素的指针与指向二维数组元素的指针变量程序中定义一个二维数组程序中定义一个二维数组时,如:时,如: int a34;C编译系统将为数组编译系统将为数组a的所的所有元素在内存中分配一片有元素在内存中分配一片连续的空间,连续

32、的空间,数组名数组名a代代表这片空间的起始地址,表这片空间的起始地址,它也是数组元素它也是数组元素a00的的地址。地址。 二维数组的每一个元素二维数组的每一个元素aij都有一个指针,它都有一个指针,它就是就是&aij。因此指针变量可以指向二因此指针变量可以指向二位数组的任何一个元素位数组的任何一个元素 。例如:例如: int a34; int *p,*q; p=&a00; q=&a23; 了解了二维数组元素的指针和指向二维了解了二维数组元素的指针和指向二维数组元素的指针变量之后,我们就可以数组元素的指针变量之后,我们就可以通过通过二维数组元素的指针或指向二维数组元素的二维数组元素的指针或指向二

33、维数组元素的指针变量指针变量来来引用二维数组元素引用二维数组元素。如果指针变量如果指针变量p的初值为的初值为&a00,二维数组的大小,二维数组的大小为为mn,则:,则:(1)*(p+k)与与ak/nk%n等价等价 aij与与*(p+i*n+j)等价。等价。 下标法,如下标法,如aij或或pk形式;形式;(2)指向二维数组元素的指针变量也可以带下标使)指向二维数组元素的指针变量也可以带下标使用,如用,如pk与与*(p+k)等价。等价。综上所述,对数组元素的综上所述,对数组元素的引用有两种方法:引用有两种方法: 指针法,如指针法,如*(p+i*n+j)或或*(p+k)形式。形式。 指针变量指针变量

34、p可以进行自增自减运算,如可以进行自增自减运算,如*p+或或*(p+)代表先对指针变量代表先对指针变量p所指向的二维数组元素所指向的二维数组元素进行引用,然后使指针变量进行引用,然后使指针变量p指向二维数组的下一指向二维数组的下一个元素。个元素。例例9.11指向二维数组元素的指针实现对二维数组元指向二维数组元素的指针实现对二维数组元素的访问。素的访问。 #include void main( ) int a34= 1,2,3,4,8,7,6,5,4,1,9,6; int *p,i,j,k; p=&a00; printf(output 1:n); while (p=&a23) printf(%3

35、d, *p+); if (p-&a00)%4= =0) printf(n); 注意该注意该if语语句的作用句的作用 p=&a00; /注意指针变量注意指针变量p的指向的指向 printf(output 2:n); for (k=0;k3*4;k+) printf(%3d,pk); if (k+1)%4= =0) printf(n); printf(output 3:n); for (i=0;i3;i+) for (j=0; j4;j+) printf(%3d,*(p+i*4+j); printf(n); return; 二维数组不仅可以看成是由所有二维数组元素二维数组不仅可以看成是由所有二维数

36、组元素组成的集合,而且也可以看成是由一维数组组成的组成的集合,而且也可以看成是由一维数组组成的二维数组。二维数组。 2 二维数组的行指针与指向一维数组的指针变量二维数组的行指针与指向一维数组的指针变量假设二维数组假设二维数组a的大小为的大小为mn:一方面一方面,将数组名,将数组名a看作是一维数组看作是一维数组a0、a1、.、am-1 的起始地址,即数组元素的起始地址,即数组元素a0的指针。根的指针。根据一维数组元素指针的运算规则,据一维数组元素指针的运算规则,a+1则是数组元则是数组元素素a1的指针。我们称这种指针为二维数组的的指针。我们称这种指针为二维数组的“行指针行指针”。 另一方面另一方

37、面,ai (0im)又可以看作是一维数组又可以看作是一维数组ai0、ai1、ai2、.、ain-1的数组名,因的数组名,因此此ai也是指针,它指向元素也是指针,它指向元素ai0,即,即ai与与&ai0等价。根据数组元素的指针运算规则可知:等价。根据数组元素的指针运算规则可知:ai+j(0jn) 是指向是指向aij的指针。也就是说,的指针。也就是说,*(ai+j)与与aij等价。等价。例:例:int a34=1,3,5,7, 9,11,13,15,17,19,21,23;1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指针行指针列指针列指针注意

38、:注意:(1)二维数组的起始地址)二维数组的起始地址a、二维数组第、二维数组第0行的起行的起始地址始地址&a0及元素及元素a00的起始地址的起始地址&a00的地的地址值相同,但是,数组名址值相同,但是,数组名a只能理解为只能理解为a0的指针,的指针,不能理解为不能理解为a00的指针。的指针。(2)对于二维数组)对于二维数组a而言,不能通过而言,不能通过a来直接引用来直接引用整个数组,也不能通过整个数组,也不能通过ai (0im)来直接引用数来直接引用数组的第组的第i行,只能直接引用数组元素行,只能直接引用数组元素aij。a和和ai (0im)都是指针。都是指针。(3)a+i与与&ai等价,它们

39、都是二维数组等价,它们都是二维数组第第i行的行指针,代表第行的行指针,代表第i行的起始地址:行的起始地址:*(a+i) 与与ai和和&ai0等价,它们都是二等价,它们都是二维数组第维数组第i行第行第0列元素的元素指针,代表列元素的元素指针,代表元素元素ai0的起始地址。的起始地址。二维数组名,数组起始地址二维数组名,数组起始地址a第第0行行a0起始地址(行指针)起始地址(行指针)&a0,a+0即即a第第i行行ai起始地址(行指针)起始地址(行指针) &ai,a+i第第0行行0列元素列元素a00地址地址&a00,a0,*(a+0)即即*a第第i行行0列元素列元素ai0地址地址&ai0,a0+i*

40、n,ai,*(a+i)第第i行行j列元素列元素aij地址地址&aij,&ai0+j,ai+j,*(a+i)+j,a0+i*n+j第第k个元素个元素ak/nk%n地地址(址(0km*n)&ak/nk%n,ak/n+k%n,*(a+k/n)+k%n,a0+k,*a+k元素元素aij的引用的引用aij,*(ai+j),*(*(a+i)+j),*(a0+i*n+j),(*(a+i)j第第k个元素个元素ak/nk%n的的引用(引用(0km*n)ak/nk%n,*(ak/n+k%n),*(*(a+k/n)+k%n),*(a0+k),*(*a+k),(*a)k二维数组元素及地址引用的各类表示法二维数组元素及

41、地址引用的各类表示法 #include void main( )int i,a34; for (i=0;i3;i+) printf(a+%d=%x ,i,a+i); printf(&a%d=%x ,i,&ai); printf(*(a+%d)=%x ,i,*(a+i); printf(a%d=%x ,i,ai); printf(&a%d0=%xn,i,&ai0); return;例例9.12 二维数组名作为行指针的应用二维数组名作为行指针的应用 输出结果:输出结果: 前面的例题中定义的指针变量前面的例题中定义的指针变量p指向一个整型数指向一个整型数组元素,组元素,p+1指向下一个元素。指向下一

42、个元素。 可定义行指针,可定义行指针,使使p不指向一个数组元素,而指不指向一个数组元素,而指向一个包含向一个包含m个元素的一维数组个元素的一维数组;p先指向先指向a0,p+1指向指向a1。 定义形式:定义形式:intint ( (* *p)4 ;p)4 ; *表示表示p是指针变量,是指针变量, 且且p所指向的对象是有所指向的对象是有4个个整型元素的数组,整型元素的数组,p+1的值比的值比p的值增加了的值增加了4*4个字节个字节(即一维数组的长度)。(即一维数组的长度)。下标法,如下标法,如aij或或pij形式;形式; 如果指向包含如果指向包含n个元素的一维数组的指针变量个元素的一维数组的指针变

43、量p的初的初值为值为a,二维数组,二维数组a的大小为的大小为mn,则通过二维数组,则通过二维数组的行指针或指向一维数组的指针变量来引用二维数组的行指针或指向一维数组的指针变量来引用二维数组元素的方法是:元素的方法是:指针法,如指针法,如*(*(a+i)+j)或或*(*(p+i)+j)形式。形式。 下标指针混合法,如下标指针混合法,如*(ai+j)、*(pi+j)、(*(a+i)j、(*(p+i)j、*(a0+i*n+j)或或(*a)i*n+j等形式。等形式。 #include void main( ) int a34=1,2,3,4,8,7,6,5,4,1,9,6; int (*p)4,i,j

44、;p=a;printf(output 1:n);while (pa+3)for (j=0; j4; j+) printf(%3d, * (*p+j); p+; printf(n); 例例9.13 指向二维数组行的行指针的应用。指向二维数组行的行指针的应用。 此处p为指向行的指针变量p=a; / 注意指针变量注意指针变量p的指向的指向printf(output 2:n);for (i=0; i3; i+) for (j=0; j4; j+) printf(%3d, * (*(p+i)+j); printf(n);return; 输出结果:输出结果: 9.3.4 9.3.4 二维数组针作函数参数二

45、维数组针作函数参数 例例9.14 某厂某年某厂某年4个季度、每季度个季度、每季度3个旬的产值已给个旬的产值已给出,要求计算该厂全年的总产值出,要求计算该厂全年的总产值 。 #include void main( ) float a46=80,8,82,4,83,1, 85,2,84,5,86,0, 83,9,85,6,86,3, 87,1,86,4,84,6; float total( );float sum; sum=total( &a00); / 用二维数组的元素指针用二维数组的元素指针作函数的实参作函数的实参 printf(Sum=%6.1fn,sum);return;float tot

46、al( float *p)/用指向变量的指针变量作函数的形参用指向变量的指针变量作函数的形参 int k;float s=0;for (k=0; k12;k+)s=s+*p+;return (s); 输出结果:输出结果:例例9.15 假设某活期储户一年来存取及存款余额情况如假设某活期储户一年来存取及存款余额情况如下表所示下表所示 。 年份年份月月日日存款额存款额取款额取款额利息利息存款余额存款余额199671200.001996720400.00600.00199686300.00300.00199610151200.001500.00199725600.002100.001997520100

47、0.001100.00199771?假设月利率为假设月利率为6,每年,每年7月月1日结息一次,并将日结息一次,并将利息转为本金。编一程序进行利息转为本金。编一程序进行7月月1日的结息工作。日的结息工作。#include #define DAYRATE 0.0002void calculate (float (*p)7,int m)/指向含指向含7个元素的一维数组的指针变量作形参个元素的一维数组的指针变量作形参 float year1,month1,day1,year2; float month2,day2,day,money,sum=0; int i; year1=*(*p); month1=

48、*(*p+1); day1=*(*p+2); money=*(*p+6); p+;for (i=1; im; i+) year2=*(*p); month2=*(*p+1); day2=*(*p+2); day=(year2 year1)*365+(month2 month1)*30+(day2 day1); sum=sum+money*day*DAYRATE; year1=year2; month1=month2; day1=day2; money=*(*p+6); p+; p=p2; money=*(*p+6); p+; *(*p+5)=sum; *(*p+6)=money+sum;voi

49、d prn(float a 7,int m)/二维数组名作形参二维数组名作形参 int i, j; printf(yeart montht dayt save take inter moneyn); for (i=0; im; i+) for (j=0; j7; j+) if (j3) printf(%3dt, (int)aij); else if (aij0.005) printf( ); else printf(%9.2f, aij); printf(n); void main( ) float save77=1996,7,1,0,0,0,200,1996,7,20,400,0,0,600

50、, 1996,8,6,0,300,0,300,1996,10,15,1200,0,0,1500,1997,2,5,600,0,0,2100,1997,5,20,0,1000,0,1100, 1997,7,1;calculate(save, 7); /用二维数组行指针作函数实参用二维数组行指针作函数实参 prn(save, 7);return;输输出出结结果:果:例例9.16 某厂四个季度某厂四个季度3种产品的产量已给出,每种产品种产品的产量已给出,每种产品的单价也给出,要求分别计算四个季度的单价也给出,要求分别计算四个季度3种产品的产值种产品的产值 。 #include void calcul

51、ate (float x ,float b ,float y ) / 用一维数组名作函数形参用一维数组名作函数形参 int j;for (j=0; j3; j+)yj=xj*bj ; void main( ) float a43= 80,76,88,93,86,54,95,73,52,89,57,96 ;float b3=3.5,5.6,2.8,c43 ;int i,j ;for (i=0 ;i4 ; i+) / 用二维数组的元素指针和一维数组用二维数组的元素指针和一维数组名(也为元素指针)作函数实参名(也为元素指针)作函数实参calculate(ai,b,ci); for (i=0; i4;

52、 i+) for (j=0; j3; j+)printf(%8.2f, cij);printf(n);return;输出结果:输出结果:1. 用字符数组处理字符串用字符数组处理字符串 C语言中只有字符串常量的概念,没有字符串语言中只有字符串常量的概念,没有字符串变量的概念,字符串变量是通过字符数组来实现的。变量的概念,字符串变量是通过字符数组来实现的。9.4.1 字符串的表示形式字符串的表示形式 例例 9.17 利用字符数组处理字符串应用。利用字符数组处理字符串应用。 #include void main( ) char str140= East China Geological instit

53、ute, str2 = Informations Engineering Department; int i=0; printf(%sn,str1); while (str2i!=0) printf(%c, str2i+); printf(n); return;输出结果:输出结果:2. 指向字符的指针变量处理字符串指向字符的指针变量处理字符串 可以不定义字符数组,而定义一个指向字符的指可以不定义字符数组,而定义一个指向字符的指针变量,并将字符串的起始地址赋给指针变量,通针变量,并将字符串的起始地址赋给指针变量,通过该指针变量亦可以实现字符串的操作。过该指针变量亦可以实现字符串的操作。例例 9.18 利用指向字符的指针变量处理字符串应用利用指向字符的指针变量处理字符串应用 。 #include void main( ) char *str1=East China Geological institute, *str2= Informations Engineering Department; int i=0; printf(%sn,str1); while (str2i) printf(%c,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论