C语言程序设计教案II(月)_第1页
C语言程序设计教案II(月)_第2页
C语言程序设计教案II(月)_第3页
C语言程序设计教案II(月)_第4页
C语言程序设计教案II(月)_第5页
已阅读5页,还剩191页未读 继续免费阅读

下载本文档

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

文档简介

1、全国计算机等级考试二级全国计算机等级考试二级Email: 主讲:胡晓丽高频考点高频考点Company Logo第第8章地址和指针章地址和指针Top45:指针变量的定义与初始化:指针变量的定义与初始化Top46:对指针变量赋值:对指针变量赋值Top47:通过指针引用一个存储单元:通过指针引用一个存储单元Top48:指针的移动:指针的移动Top49:指针的比较:指针的比较Top51:指针作为函数的返回值:指针作为函数的返回值Top50:指针作为函数的参数:指针作为函数的参数Company Logo1、变量、变量:实质是代表了:实质是代表了“内存中的某个存储单元内存中的某个存储单元”。若在内存中定义

2、了一个变量,则这个变量的内存的地址也就确定了。若在内存中定义了一个变量,则这个变量的内存的地址也就确定了。例:例:short int a,b=4; float x;010010011100110100000000000001000100100111001101010010011100110110121013101510161201120212031203&a=1012&b=1015&x=1201我们在程序中只需要指出变量名,无需知道每个变量在内存中的具体地址,我们在程序中只需要指出变量名,无需知道每个变量在内存中的具体地址,每个变量与具体地址的联系是由每个变量与具体地址

3、的联系是由C编译系统来完成的。对变量的存取操作编译系统来完成的。对变量的存取操作就是对某个存储单元进行操作。这种就是对某个存储单元进行操作。这种直接按变量的地址存取变量值直接按变量的地址存取变量值的方式的方式称为称为“直接存取直接存取”。Top45 指针变量的定义与初始化指针变量的定义与初始化Company Logo程序中: int i; float k; 内存中每个字节有一个编号-地址.2000200120022005内存02003ik 编译或函数调用时为其分配内存单元变量是对程序中数据存储空间的抽象Top45 指针变量的定义与初始化指针变量的定义与初始化Company Logo2、指针、指

4、针:也是一种变量,这种变量:也是一种变量,这种变量是用来存放内存地址的。是用来存放内存地址的。&a2001p=&a;1011间接存取:这种通过变量间接存取:这种通过变量p到变量到变量a的地址,然后再存取的地址,然后再存取变量变量a的值的方式称为的值的方式称为“间接存取间接存取”。指针变量指针变量p指向了变量指向了变量a的含义是:指针的含义是:指针p中存放了变量中存放了变量a的地址。的地址。ap例:例:int *p; int a=3;10122002Top45 指针变量的定义与初始化指针变量的定义与初始化0000001100000000Company Logo定义指针变量的形式:

5、定义指针变量的形式:类型名指针变量名类型名指针变量名1,指针变量名,指针变量名2,例:例: int *pi,*pj;(1)*是一个说明符,说明该变量是指针变量。是一个说明符,说明该变量是指针变量。(2)*不可省略,否则就变成了不可省略,否则就变成了int pi, pj(定义两个整型变量)。(定义两个整型变量)。例:例: double *pd; char *s1,*s2;只能是指向只能是指向double型的变量型的变量,即存放即存放double变量的地址。变量的地址。只能是指向只能是指向char型的变量型的变量,即存放即存放char型变量的地址。型变量的地址。Top45 指针变量的定义与初始化指

6、针变量的定义与初始化Company Logo例:例:int *p,*s,k=20; s=&k; p=&s;.2000200420062005整型变量k变量s200120022003变量p20072008202000200020042004s=*pk=*s所以:所以:k=*p说明:说明:(1)指针)指针p的基类型是的基类型是int类型的指针。类型的指针。(2)是求地址运算符。)是求地址运算符。(3)因为基本数据类型)因为基本数据类型int、float、char等所等所需存储空间不同,所以需存储空间不同,所以需要定义指针变量的基需要定义指针变量的基类型。类型。Top45 指针变量的

7、定义与初始化指针变量的定义与初始化Company Logo例例: 指针的概念指针的概念main() int a; int *pa=&a; a=10; printf(a:%dn,a); printf(*pa:%dn,*pa); printf(&a:%x(hex)n,&a); printf(pa:%x(hex)n,pa); printf(&pa:%x(hex)n,&pa);运行结果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f88(hex).f86f8af8cf8b整型变量a10指针变量paf87f88f89f8

8、6Top45 指针变量的定义与初始化指针变量的定义与初始化Company LogoTop45 指针变量的定义与初始化指针变量的定义与初始化v 考点考点指针变量定义的形式:存储类型存储类型 类型名类型名 * *指针变量名指针变量名1,1,* *指针变量名指针变量名2,2,也可以定义的同时赋初值:存储类型存储类型 类型名类型名 * *指针变量名指针变量名1=1=初值初值, “存储类型存储类型”可以缺省可以缺省, ,缺省时的存储类型为自动型缺省时的存储类型为自动型aotoaoto 定义指针变量时,指针变量名前必须有一个定义指针变量时,指针变量名前必须有一个* *,在此它是,在此它是定义指针变量的标志

9、,不同于后面所说的定义指针变量的标志,不同于后面所说的“指针运算符指针运算符” 初值的形式通常有三种:初值的形式通常有三种:“& &普通变量名普通变量名”、“& &数组元数组元素素”和和“数组名数组名”C C语言规定:语言规定:数组名代表的是数组的首地址,即第一个元素的地址。数组名代表的是数组的首地址,即第一个元素的地址。Company LogoTop45 指针变量的定义与初始化指针变量的定义与初始化v真题分析真题分析(2013年3月)DCompany LogoTop45 指针变量的定义与初始化指针变量的定义与初始化v真题分析真题分析(2007年4月) floa

10、t x;则以下对指针变量p进行定义且赋初值的语句中正确的是A、 float *p=1024;B、 int *p=(float)xC、 float p=&xD、float *p=&aDCompany LogoTop45 指针变量的定义与初始化指针变量的定义与初始化v真题分析真题分析(2004年4月)设有定义:int n=0,*p=&n,*q=&p;则以下选项中,正确的赋值语句是:A、p=1B、*q=2C、q=p;D、*p=5.f86f8af8cf8bf87f88f89整型变量n指针变量p指针变量q0f86f88*q=p*p=n*q = pn=*DCompany L

11、ogoTop46给指针变量赋值给指针变量赋值指针变量可以通过不同的方式获得地址值,从而指向一个具体的对象。指针变量可以通过不同的方式获得地址值,从而指向一个具体的对象。指针变量指针变量获得地址获得地址通过取地址运算符通过取地址运算符通过指针变量通过指针变量通过标准函数通过标准函数Company LogoTop46给指针变量赋值给指针变量赋值:表示求出变量的地址。:表示求出变量的地址。例:例:int k=1,*q,*p;q=&k;1 1、通过取地址运算符、通过取地址运算符.2000200420062005整型变量k变量q200120022003变量p20072008120002000无具

12、体地址值*q 1Company LogoTop46给指针变量赋值给指针变量赋值(3)在)在scanf函数中,输入的各变量之前都必须加符号函数中,输入的各变量之前都必须加符号&,就是把从,就是把从终端读入的数据依次放到这些地址所代表的存储单元中。终端读入的数据依次放到这些地址所代表的存储单元中。所以,以下语句是等价的。所以,以下语句是等价的。 scanf(“%d”,&k); q=&k;scanf(“%d”,q); 2 2、通过指针变量获得地址值、通过指针变量获得地址值通过赋值运算把一个指针变量中的地址赋给另外一个指针变量,从而使通过赋值运算把一个指针变量中的地址赋给另外一

13、个指针变量,从而使两个指针指向同一个地址。两个指针指向同一个地址。Company Logo例:例: int k=1,*p,*q; q=&k; p=q;.2000200420062005整型变量k变量q200120022003变量p20072008120002000*q 120002000Top46给指针变量赋值给指针变量赋值Company Logo3 3、通过标准函数获得地址、通过标准函数获得地址通过调用库函数通过调用库函数malloc和和calloc在内存中开辟动态存储单元,并把所在内存中开辟动态存储单元,并把所开辟的动态存储单元的地址赋给指针变量。开辟的动态存储单元的地址赋给指针变

14、量。NULL是在是在stdio.h中定义的预定义符,代码值为中定义的预定义符,代码值为0。p=NULL;执行该语句后,执行该语句后,p就称为空指针。上述代码等价于:就称为空指针。上述代码等价于:p=0; 或或p0;说明:说明:(1)这时)这时p是具有一个确定的值是具有一个确定的值“空空”,而不是指向地址为,而不是指向地址为0的存储单元。的存储单元。(2)不能通过一个空指针去访问一个存储单元时,否则会得到一个出错信息。)不能通过一个空指针去访问一个存储单元时,否则会得到一个出错信息。Top46给指针变量赋值给指针变量赋值Company Logo指针变量必须先赋值先赋值, ,再使用再使用例 mai

15、n( ) int i=10; int *p; *p=i; printf(“%d”,*p); 危险!危险!例 main( ) int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); .2000200420062005整型变量i10指针变量p200120022003随机Top46给指针变量赋值给指针变量赋值Company Logov 考点:考点:一个指针可以通过以下三种方式获得一个确定的地址,从而指向一个具体的对象: 通过求地址运算(&) 通过指针变量获得地址值 通过标准函数获得地址值Top46给指针变量赋值给指针变量赋值求地址运算符&am

16、p; &只能用于变量变量和数组元素数组元素,不能用于表达式、常量或者被说明为register的变量。且&必须放在运算对象的左边,而且运算对象的类型必须与指针变量的基类型相同。Company Logov真题分析:真题分析:(2013年3月)Top46给指针变量赋值给指针变量赋值CCompany Logov真题分析:真题分析:(2013年3月)Top46给指针变量赋值给指针变量赋值DCompany Logov真题分析:真题分析:(2005年9月)设有定义:int n1=0,n2,*p=&n2,*q=&n1;,以下赋值语句中与n2=n1;语句等价的是A、*p=*q;B

17、、 p=q;C、 *p=&n1;D、 p=*q;Top46给指针变量赋值给指针变量赋值ACompany LogoTop47通过指针来引用一个存储单元通过指针来引用一个存储单元*:间接访问运算符(间址运算符):间接访问运算符(间址运算符)例:例: int *p,i=10,j; p=&i; j=*p;/* 等价于等价于j=*(&i) */.2000200420062005整型变量i变量j200120022003变量p20072008102000*p 10200010上述语句等价于:上述语句等价于:j=i;说明:说明:(1)*的运算对象必须是地址或者是的运算对象必须是地址或者

18、是存放地址的指针变量。存放地址的指针变量。(2)*的含义是取地址中的内容的含义是取地址中的内容Company Logo例:例: int *p,*s,k=20;s=&k;p=&s;*s代表存储单元代表存储单元k*p代表存储单元代表存储单元s*(*p)代表存储单元代表存储单元k20pskTop47通过指针来引用一个存储单元通过指针来引用一个存储单元.f86f8af8cf8bf87f88f89整型变量k指针变量s指针变量p20f86f88*p=s*s=k*p = sk=*Company Logo200010i_pointer*i_pointer&i_pointeri.2000

19、200420062005整型变量i10变量i_pointer2001200220032000指针变量i_pointer-指针变量,它的内容是地址量*i_pointer-指针的目标变量,它的内容是数据&i_pointer-指针变量占用内存的地址i_pointer &i &(*i_pointer)i *i_pointer *(&i)i_pointer = &i = &(*i_pointer)i = *i_pointer = *(&i)Top47通过指针来引用一个存储单元通过指针来引用一个存储单元&与*运算符 含义含义 两者关系:互为逆

20、运算逆运算 理解含义: 取变量的地址单目运算符优先级: 2结合性:自右向左自右向左含义: 取指针所指向变量的内容单目运算符优先级: 2结合性:自右向左自右向左Company LogoTop47通过指针来引用一个存储单元通过指针来引用一个存储单元v 考点考点1.指针运算符指针运算符“*”:其作用是返回以操作对象:其作用是返回以操作对象的值作为地址的变量的内容。的值作为地址的变量的内容。2. 指针运算符指针运算符“*”是单目运算符,优先级高于所是单目运算符,优先级高于所有的双目运算符,结合性是自右向左。有的双目运算符,结合性是自右向左。Company LogoTop47通过指针来引用一个存储单元通

21、过指针来引用一个存储单元v真题分析真题分析(2007年4月)有以下程序,该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是:A、int n,*p=NULL;B、*p=&n;C、scanf(“%d”,&p);D、 printf(“%dn”,p);#include “stdio.h”main()int n,*p=null;*p=&n;printf(“input n:”);scanf(“%d”,&p);printf(“output n:”);printf(“%dn”,p);ACompany LogoTop47通过指针来引用一个存储单元通过指

22、针来引用一个存储单元v真题分析真题分析(2007年4月)以下程序的功能是:利用指针指向三个整型变量,并通过指针运算找出三个数中的最大值,输出到屏幕上,请填空:main() int x,y,z,max,*px,*py,*pz,*pmax; scanf(%d%d%d,&x,&y,&z); px=&x; py=&y; pz=&z; pmax=&max; _; if(*pmax*py) *pmax=*py; if(*pmax*pz) *pmax=*pz; printf(max=%dn,max);*pmax=*px或或*pmax=x或或max=x或

23、或max=*pxCompany LogoTop47通过指针来引用一个存储单元通过指针来引用一个存储单元v真题分析真题分析(2005年年9月)月)若有定义:int x=0,*p=&x;,则语句printf(%dn,*p);的输出结果是A、随机值B、0C、x的地址D、p的地址BCompany Logo考点:考点:所谓移动指针就是对指针变量加上或减去一个所谓移动指针就是对指针变量加上或减去一个整数整数,或通过赋值运算,使指针指向相邻的存储单元。只有或通过赋值运算,使指针指向相邻的存储单元。只有当指针指向一串连续的存储单元时,还可以和指向同当指针指向一串连续的存储单元时,还可以和指向同一串连续

24、存储单元的指针进行相减的运算,除此之一串连续存储单元的指针进行相减的运算,除此之外,不可以对指针进行任何其它的算术运算。外,不可以对指针进行任何其它的算术运算。Top48指针的移动指针的移动指针变量只能进行逻辑运算和相减的算术运算。指针变量只能进行逻辑运算和相减的算术运算。不是指向同一数组的指针变量运算是无意义的。不是指向同一数组的指针变量运算是无意义的。指针变量的值加指针变量的值加1或减或减1,并不能地址加,并不能地址加1中减中减1,而是加,而是加上或减去该变量在内存中所占的字节数,该字节数由指上或减去该变量在内存中所占的字节数,该字节数由指针的基类型决定。针的基类型决定。Company L

25、ogo111122334455a0a1a2a3a4pqDD00DD02DD04DD06DD08DD0ADD0CDD0EDD10ijDD12DD14DD16p=&a0;DD00q=p+2;DD04q+;DD06q-;DD04i=*p;11j=*q;33k=*p-*q;k-22Top48指针的移动指针的移动例:例:Company LogoTop48指针的移动指针的移动v真题分析真题分析(2013年3月)BCompany LogoTop48指针的移动指针的移动v真题分析真题分析(2004年9月)设有定义语句int x6=2,4,6,8,5,7,*p=x,i;要求依次输出x数组中6个元素的值,

26、不能完成此操作的语句是A、for(i=0;i6;i+) printf(“%2d”,*(p+);B、 for(i=0;i6;i+) printf(“%2d”,*(p+i);C、 for(i=0;i6;i+) printf(“%2d”,*p+);D、 for(i=0;i6;i+) printf(“%2d”,*(p)+);DCompany Logo考点:考点:在关系表达式中,可以对指针进行比较。即两个变在关系表达式中,可以对指针进行比较。即两个变量地址的比较。量地址的比较。例:例:if(pq) printf(“p points to lower memory than q”);if(p=0) pri

27、ntf(“p points to NULL.”);通常两个或多个指针指向同一目标时(一串连通常两个或多个指针指向同一目标时(一串连续的存储单元),比较才有意义。续的存储单元),比较才有意义。Top49指针的比较指针的比较Company LogoTop49指针的比较指针的比较v真题分析真题分析(2007年4月)有以下函数,该函数的功能是A、比较两个字符串的大小B、计算s所指字符串所占内存字节的个数C、计算s所指字符串的长度D、将s所指字符串复制到字符串t中int fun(char *s)char *t=s;while(*t+);return (t-s);BCompany LogoTop50指针作

28、为函数的参数指针作为函数的参数指针可以作为参数在主调函数和被调用函数之间传指针可以作为参数在主调函数和被调用函数之间传递数据,通过指针可以在被调用函数中地调用中的递数据,通过指针可以在被调用函数中地调用中的变量进行引用,这也就使得通过形参改变对应实参变量进行引用,这也就使得通过形参改变对应实参的值有了可能,利用此形式就可以把两个或两个以的值有了可能,利用此形式就可以把两个或两个以上的数据从被调用的函数返回到调用函数。上的数据从被调用的函数返回到调用函数。Company Logo#include “stdio.h”int myadd(int *a,int *b)int sum;sum=*a+*b

29、;return sum;main()int x,y,z;printf(“Enter x,y:”);scanf(“%d%d”,&x,&y);z=add(&x,&y);printf(“%d+%d=%dn”,x,y,z);通过传送地址值,可以在被调用函数中对调用函数中的变量进行引用。通过传送地址值,可以在被调用函数中对调用函数中的变量进行引用。Top50指针作为函数的参数指针作为函数的参数例:编写函数例:编写函数myadd(int *a,int *b)函数中把两个指针函数中把两个指针a和和b所指的存储单元中的两个值相加,然后将和所指的存储单元中的两个值相加,然后将和值

30、作为函数值返回。在主函数中输入两个数给变量,把变量地址作值作为函数值返回。在主函数中输入两个数给变量,把变量地址作为实参,传递给对应形参。为实参,传递给对应形参。abxyzsum.20002008200A200220042006200C200ECompany Logoswap(int x,int y) int temp; temp=x; x=y; y=temp;main() int a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);例例 将数从大到小输出将数从大到小输出值传递.20002008200A2

31、002200420065变量a 变量b(main)9运行结果:5, 9变量x 变量y(swap) 变量t59595Top50指针作为函数的参数指针作为函数的参数Company Logoswap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a

32、,b);.20002008200A200220042006200C200E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_220002002(swap)指针p1指针p2整型p5920002002COPY5例例 将数从大到小输出将数从大到小输出Top50指针作为函数的参数指针作为函数的参数运行结果:9,5地址传递通过传送地址值,可以在被调用函数中直接改变调用函数中的变量的值通过传送地址值,可以在被调用函数中直接改变调用函数中的变量的值Company Logoswap(int x,int y) int t; t=x; x=y; y=t;main() int

33、 a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(*pointer_1,*pointer_2); printf(n%d,%dn,a,b);运行结果:5,9例例 将数从大到小输出将数从大到小输出值传递.20002008200A200220042006200C200E2010.59整型a 整型b(main)pointer_1pointer_2200020029COPY(swap)整型x整型b整型t555 9Top50指针作为函数的参

34、数指针作为函数的参数Company Logov 真题分析真题分析(2013年3月)Top50指针作为函数的参数指针作为函数的参数CCompany Logov真题分析真题分析(2006年4月)有以下程序,程序运行后的输出结果是A、123,abcB、abc,123C、1bc,a23D、321,cbaTop50指针作为函数的参数指针作为函数的参数void swap(char *x,char *y) char t;t=*x; *x=*y; *y=t;main( ) char *s1=abc,*s2=123;swap(s1,s2); printf(%s,%sn,s1,s2);CCompany Logov

35、真题分析真题分析(2005年4月)有以下程序,程序运行后的输出结果是A、8,2,3,4,5,6,7,1B、 5,6,7,8,1,2,3,4C、 1,2,3,4,5,6,7,8 D、 8,7,6,5,4,3,2,1Top50指针作为函数的参数指针作为函数的参数void f(int *x, int *y) int t;t=*x,*x=*y;*y=t;main( ) int a8=1,2,3,4,5,6,7,8,i,*p,*q;p=a;q=&a7;while(pq) f(p,q); p+ +; q-;for (i=0;i8;i+) printf(%d,ai);DCompany LogoTop

36、51指针作为函数返回值指针作为函数返回值v 考点考点指针作为函数的返回值的一般形式为:类型名类型名 *函数名(形式参数说明列表)函数名(形式参数说明列表)1. 存储类型有两种:static和extern,默认为extern2. “*函数名”不能写成“(*函数名)”否则就成了指向函数的指针。3. 此类型函数的调用形式通常是:p=函数名(实参列表)其中p通常是主调函数中定义的一个指针变量。Company LogoTop51指针作为函数返回值指针作为函数返回值v真题分析真题分析(2005年9月)有以下程序,程序运行后的结果是A、8,16 B、8,8 C、16,16 D、4,8main( ) floa

37、t (*p1)(float),(*p2)(float),(*t)(float),y1,y2;p1=f1; p2=f2;y1=p2(p1(2.0);t=p1; p1=p2; p2=t;y2=p2(p1(2.0);printf(%3.0f, %3.0fn,y1,y2);float fl(float n) return n*n; float f2(float n)return 2*n;ACompany LogoTop51指针作为函数返回值指针作为函数返回值v真题分析真题分析(2013年3月)CCompany Logo第第9章数组章数组Top52:一维数组的定义与初始化:一维数组的定义与初始化Top5

38、3:一维数组的引用:一维数组的引用Top54:指向数组的指针变量的运算:指向数组的指针变量的运算Top55:数组元素作为参数:数组元素作为参数Top56:数组名作为函数的实参:数组名作为函数的实参Top58:二维数组元素的一般引用:二维数组元素的一般引用Top57:二维数组的定义与初始化:二维数组的定义与初始化Company Logo第第9章数组章数组Top59:通过地址引用二维数组元素:通过地址引用二维数组元素Top60:通过建立行指针引用二维数组元素:通过建立行指针引用二维数组元素Top61:二维数组名作为实参时函数的调用:二维数组名作为实参时函数的调用Top63:指针数组作为实参时函数的

39、调用:指针数组作为实参时函数的调用Top62:通过建立指针数组引用二维数组元素:通过建立指针数组引用二维数组元素Company Logo什么是数组?什么是数组?数组是C提供的一种最简单的构造类型。每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元。在程序中,这些变量具有相同的名字,但具有不同的下标。如a0,a1,a2等。Company LogoTop52一维数组的定义和初始化一维数组的定义和初始化一维数组:数组中的每个元素只带有一个下标。形式如下:一维数组:数组中的每个元素只带有一个下标。形式如下:类型名数组名类型名数组名整型常量表达式整型常量表达式,例:例:int a6;

40、合法标识符表示元素个数下标从0开始 :数组运算符单目运算符不能用( )a00145a1a2a3a4a523a编译时分配连续内存内存字节数=数组维数* sizeof(元素数据类型)数组名表示内存首地址,是地址常量地址常量例 int i=15; int datai; ( 不能用变量定义数组维数)例 int data5; data5=10; /C语言对数组不作越界检查,使用时要 注意Company LogoTop52一维数组的定义和初始化一维数组的定义和初始化初始化方式初始化方式 在定义数组时,为数组元素赋初值(在编译阶段使之得到初值) int a5=1,2,3,4,5;等价于:a0=1; a1=2

41、; a2=3; a3=4; a4=5;v说明:l数组不初始化,其元素值为随机数l对static数组元素不赋初值,系统会自动赋以0值l当全部数组元素赋初值时,可不指定数组长度如 int a5=6,2,3; 等价于: a0=6; a1=2;a2=3; a3=0; a4=0;如 int a3=6,2,3,5,1; ()static int a5;等价于:a0=0; a1=0; a2=0; a3=0; a4=0;l只给部分数组元素赋初值 int a=1,2,3,4,5,6;编译系统根据初值个数确定数组维数 char c=a,0,0,0;编译系统根据初值个数确定数组维数等价于: char c4=a;Co

42、mpany LogoTop52一维数组的定义和初始化一维数组的定义和初始化v真题分析真题分析(2013年3月)BCompany LogoTop52一维数组的定义和初始化一维数组的定义和初始化v真题分析真题分析(2005年4月)下列能正确定义一维数组的选项是A、 int a5=0,1,2,3,4,5;B、 char a =0,1,2,3,4,5;C、char a=A, B, C;D、int a5=0123;BCompany LogoTop52一维数组的定义和初始化一维数组的定义和初始化v真题分析真题分析(2005年4月)下列叙述中错误的是A、对于double 类型数组,不可以直接用数组名对数组进

43、行整体输入或输出B、数组名代表的是数组所占存储区的首地址,其值不可改变C、在程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息D、可以通过赋初值的方式确定数组元素的个数CCompany LogoTop52一维数组的定义和初始化一维数组的定义和初始化v练习题练习题1、以下能正确定义一维数组的是A、int num;B、#define N 100 int numN;C、int num0100D、int N=100; int numN;CCompany LogoTop53 一维数组元素的引用一维数组元素的引用一维数组的引用v数组必须先定义先定义,后使用后使用v只能逐个引

44、用数组元素,不能一次引用整个数组v数组元素表示形式: 数组名数组名下标下标其中:下标可以是常量或整型表达式例 int a10; printf(“%d”,a); ()必须 for(j=0;j10;j+) printf(“%dt”,aj); ()Company Logo通过数组的首地址引用数组元素通过数组的首地址引用数组元素间接访问运算符间接访问运算符*:引用地址所在存储单元。:引用地址所在存储单元。a=&a0 *&a0=*(a+0)=*a地址内容例:以下语句的功能是逐个输出例:以下语句的功能是逐个输出a数组元素中的值数组元素中的值for(k=0;k10;k+)printf(“%d

45、”,ak);Top53 一维数组元素的引用一维数组元素的引用for(k=0;k10;k+)printf(“%d”,*(a+k);Company Logo通过指针引用一维数组元素通过指针引用一维数组元素float array10,*p,k;p=a ;for(k=0;k10;k+) printf(“%4d”,*(p+k);并没有移动指针并没有移动指针。相当于:。相当于:for(k=0;k10;k+) printf(“%4d”, ak);Top53 一维数组元素的引用一维数组元素的引用array0array1array2array3array9.整型指针p&array0整型变量kCompan

46、y Logoint *p,a10,i;p=a;用带下标的指针变量引用一维数组元素用带下标的指针变量引用一维数组元素ai可以用三种表达式来表示可以用三种表达式来表示ai的地址的地址a+ip+iai*(a+i)*(p+i)也可以用四种表达式来表示数组元素也可以用四种表达式来表示数组元素aipi1234注意:注意:pi和和 ai均可表均可表示数组中的第示数组中的第i个元个元素,但是素,但是a和和p有着有着明显的区别,明显的区别,a是不是不可变的,而可变的,而p中的地中的地址却是可以改变的。址却是可以改变的。a+a=pp+p=ap=&aiTop53 一维数组元素的引用一维数组元素的引用Comp

47、any Logoa0a1a2a3a9.aa+9a+1a+2地址元素下标法a0a1a2a9a0a1a2a3a9.pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9) 变址运算符ai *(a+i)ai pi *(p+i) *(a+i)*a*(a+1)*(a+2)*(a+9)p0p1p2p9Top53 一维数组元素的引用一维数组元素的引用Company LogoTop52一维数组的定义和初始化一维数组的定义和初始化v真题分析真题分析(2013年3月)Company Logo真题分析真题分析(2013年3月)Top53 一维数组元素的引用一维数组元素的引用CCompany Log

48、o真题分析真题分析(2005年4月)有定义语句:int b; char c10;则正确的输入语句是_A、scanf(%d%s,&b,&c);B、scanf(%d%s,&b,c)C、scanf(%d%s,b,c);D、scanf(%d%s,b,&c);Top53 一维数组元素的引用一维数组元素的引用BCompany Logov真题分析真题分析(2006年4月)下列程序,运行后输出结果是Top53 一维数组元素的引用一维数组元素的引用main( ) int i,s=0,t =l,2,3,4,5,6,7,8,9;for(i=0;i9;i+ =2)s+ =*(t+i);

49、printf(%dn,s);A、45B、20C、25D、36CCompany Logov真题分析真题分析(2005年4月)有以下程序,程序运行后的输出结果是A、42B、45C、56D、60Top53 一维数组元素的引用一维数组元素的引用main( ) int p8=11,12,13,14,15,16,17,18,i=0,j=0;while(i+ +7)if(pi%2) j+ =pi;printf(%dn,j);BCompany Logov真题分析真题分析(2006年9月)有以下程序,程序运行后的输出结果是A、10B、11C、14D、15Top53 一维数组元素的引用一维数组元素的引用main(

50、 ) int a =2,4,6,8,10,y=0,x,*p;p=&a1;for(x=1;x3;x+ +) y+ =px;printf(%dn,y);CCompany LogoTop54 指向数组的指针变量的运算指向数组的指针变量的运算一维数组和数组元素的地址一维数组和数组元素的地址数组名可认为是一个存放地址值的指针变量名,其中的地址值是数组第一个元素的地址,也就是数组所占一串存储单元的起始地址,定义数组时的类型即是此指针变量的基类型。注意:注意:这个指针变量中的地址值不可改变,即不可以给数组名重新赋值!这个指针变量中的地址值不可改变,即不可以给数组名重新赋值!也可认为数组名是一个地址常

51、量。也可认为数组名是一个地址常量。例:例:float a10,*p,x; a=&x; a+;Company Logo例例 int array10; int *p; p=&array0; / p=array;或或 int *p=&array0;或或 int *p=array;array0array1array2array3array9.整型指针p&array0p数组名是表示数组首地址的地址常量Top54 指向数组的指针变量的运算指向数组的指针变量的运算Company Logo可以用对数组名加一个整数的办法,来依次表达上不同元素的地址。可以用对数组名加一个整数的办法

52、,来依次表达上不同元素的地址。例:例: float a10,*p,k;for(k=0;k10;k+) p=a+k; array0array1array2array3array9.整型指针p&array0pTop54 指向数组的指针变量的运算指向数组的指针变量的运算Company Logo可用以下语句输入数组元素。可用以下语句输入数组元素。例:例:for(k=0;k10;k+)scanf(“%d”,a+k);下面的语句功能均是从键盘读入数放入数组中下面的语句功能均是从键盘读入数放入数组中for(p=a,k=0;k10;k+) scanf(“%d”,p); p+;for(p=a;p-a10

53、;p+)scanf(“%d”,p);for(p=a,k=0;k10;k+) scanf(“%d”,p+)Top54 指向数组的指针变量的运算指向数组的指针变量的运算Company LogoTop54 指向数组的指针变量的运算指向数组的指针变量的运算v考点考点算术运算:算术运算:p+,p-,+p,-p,p+N,p-N指针变量与指针变量的相减运算指针变量与指针变量的相减运算Company LogoTop54 指向数组的指针变量的运算指向数组的指针变量的运算v真题分析真题分析(2006年9月)在16位编译系统上,若有定义int a=10,20,30,*p=&a;当执行p+后,下列说法错误的是

54、A、p向高地址移动了一个字节B、 p向高地址移动了一个存储单元C、 p向高地址移动了两个字节D、 p与a+1等价ACompany LogoTop54 指向数组的指针变量的运算指向数组的指针变量的运算v真题分析真题分析(2005年4月)有以下程序,程序运行后的输出结果是A、1,2,3,4,5,6,7,8,9,0B、2,3,4,5,6,7,8,9,10,1C、0,1,2,3,4,5,6,7,8,9D、1,1,1,1,1,1,1,1,1,1main()int a=1,2,3,4,5,6,7,8,9,0,*p;for(p=a;pa+10;p+)printf(“%d”,*p);ACompany Logo

55、Top55 数组元素作为函数的参数数组元素作为函数的参数v考点考点在调用函数时,在调用函数时,数组元素作为实参数组元素作为实参传递给形参,传递给形参,每个数组元素实际上代表内存中的一个存储单元,每个数组元素实际上代表内存中的一个存储单元,和和普通变量一样普通变量一样,对应的形参必须是类型相同的,对应的形参必须是类型相同的变量。数组元素的值可以传递给对应的形参变量,变量。数组元素的值可以传递给对应的形参变量,在函数中只能对该变量进行操作,而不能直接引在函数中只能对该变量进行操作,而不能直接引用对应的数组元素,更不可能在函数中改变对应用对应的数组元素,更不可能在函数中改变对应数组元素的值。数组元素

56、的值。Company LogoTop55 数组元素作为函数的参数数组元素作为函数的参数v真题分析真题分析(2006年9月)有以下程序,程序运行后的输出结果是A、6 7 8 9 10B、1 3 5 7 9C、1 2 3 4 5 D、6 2 3 4 5void change (int k )k0=k5;main( ) int x10=1,2,3,4,5,6,7,8,9,10,n=0;while (n=4) change(&xn);n+ +;for(n=0;n5;n+ +) printf(%d,xn);printf(n);ACompany Logo说明:说明:(1)当数组名作为实参时,对应的

57、形参除了是指针外,还可以用另外)当数组名作为实参时,对应的形参除了是指针外,还可以用另外两种形式。两种形式。 arrin(int *a) arrin(int a) arrin(int aM)对于后两种形式,虽然说明的形式与数组的说明相同,但对于后两种形式,虽然说明的形式与数组的说明相同,但C编译程序都编译程序都将将a处理成第一种的指针形式。处理成第一种的指针形式。(2)当传递数组名时,在被调用函数中也同样可以用数组元素的形式来引)当传递数组名时,在被调用函数中也同样可以用数组元素的形式来引用调用函数中对应的数组元素。这种只是形式上的相似,用调用函数中对应的数组元素。这种只是形式上的相似,并不是

58、整个数并不是整个数组可以传递给被调用函数。组可以传递给被调用函数。(3)在被调用函数中,)在被调用函数中,并没有为与数组名对应的形参开辟一串连续的空间,并没有为与数组名对应的形参开辟一串连续的空间,只是开辟了一个指针变量的存储单元只是开辟了一个指针变量的存储单元。在被调用函数中所引用的数组元。在被调用函数中所引用的数组元素就是实参数组中的元素。调用函数只是把数组的首地址传递给了形参素就是实参数组中的元素。调用函数只是把数组的首地址传递给了形参指针,仍是遵循按指针,仍是遵循按“值值”传递。传递。Top57 数组名作为函数的参数数组名作为函数的参数Company LogoTop57 数组名作为函数

59、的参数数组名作为函数的参数v 考点考点1. 数组名作为函数的参数,在函数间传递的并不是数组名作为函数的参数,在函数间传递的并不是整个数组,而是数组的首地址,换句话说,就是整个数组,而是数组的首地址,换句话说,就是形参数组与实参数组指向的是同一个数组。因此,形参数组与实参数组指向的是同一个数组。因此,在调用函数中改变了形参数组的某元素的值,其在调用函数中改变了形参数组的某元素的值,其对应的实参数组元素的值也跟着变化。对应的实参数组元素的值也跟着变化。2. 当数组名作为形参时,其对应的实参可以是指针当数组名作为形参时,其对应的实参可以是指针变量,也可以是数组名,或是地址表达式。变量,也可以是数组名

60、,或是地址表达式。Company LogoTop57 数组名作为函数的参数数组名作为函数的参数v真题分析真题分析(2013年3月)CCompany LogoTop57 数组名作为函数的参数数组名作为函数的参数v真题分析真题分析(2013年3月程序填空题)Company LogoTop57 数组名作为函数的参数数组名作为函数的参数v真题分析真题分析(2013年3月程序填空题)#include #include #define N 10double fun(double x,double *av) int i,j; double d,s; s=0; for(i=0; iN; i+) s = s +

61、xi;/*found*/ _1_=s/N; d=32767; for(i=0; iN; i+) if(xi*av & *av - xi=d)/*found*/ d=*av-xi; j=_2_;/*found*/ return _3_;main() int i; double xN= 46,30,32,40,6,17,45,15,48,26; double av,m; for(i=0; iN; i+) printf(%4.0f ,xi); printf(n); m=fun(x,&av); printf(nThe average is: %fn,av); printf(m=%5.0f ,m); printf(n);Company LogoTop57 数组名作为函数的参数数组名作为

温馨提示

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

评论

0/150

提交评论