海大曲少珍C程 手册10_第1页
海大曲少珍C程 手册10_第2页
海大曲少珍C程 手册10_第3页
海大曲少珍C程 手册10_第4页
海大曲少珍C程 手册10_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、第10章 指针 1414第10章 指针第一部分:练习(一) 填空1. 指针变量中存储的值实际上是另一个数据的_。2. 可以直接赋给指针变量的值只有三个即 _、_和_。3. 若有语句int a3=1,2,3,*p; p=a;则表达式(*p)+、 *(p+)、*p+ 的值分别是 _、_、_,每个表达式执行完毕后指针p的位置是 _、_、_。4. 访问一维整型数组a各个元素的指针变量定义形式为_ ,要想该指针指向这个数组的首元素,则要执行语句_。5. 访问3行4列的二维整型数组b各个元素的指针变量定义形式为 _ ,要想该指针指向数组的首元素,则要执行语句_;访问二维整型数组各行的指针变量定义形式为 _

2、 ,要想该指针指向数组的首行,则要执行语句_ 。6. 若有语句:int a3=1,2,3, *p ; p=a;则数组下标为2的元素用指针形式引用为:_。7. 若有语句:int a33=1,2,3,4,5,6,7,8,9, *p1, (*p2)3;p1=&a00; p2=a; 则第1行第2列的元素用指针p1引用形式为 _ ,该元素用指针p2引用形式为_ 。8. 若有定义 char *p3;则该语句定义的是 _ ,其访问的数据类型为_。9. 若有定义 char (*p)3;则该语句定义的是 _ ,其访问的数据类型为 _ 。10. 若有定义int *q4;若想定义一指针变量p指向其首地址,则

3、指针的定义和初始化形式为_ 。11. 如果一个函数的返回值是一个地址,则该函数的函数名前必须添加一个 _ 。12. 若有函数原型void aver( char *, char *),则定义访问该函数的指针形式为 _ ,要想指针指向该函数需执行语句_ 。13. 对于指针变量只能进行有限的几种运算,特别是指针指向数组时这些运算才有意义,试举出几种指针运算_、_、_、_、_、_。(二) 简答1对于没有正确初始化的指针,或者这个指针没有指向内存中的特定位置,当程序员要使用形式“*指针名”时,会发生什么情况?这时会出现什么错误?(三) 分析程序1下面程序的运行结果是: #include <stdi

4、o.h>void swap(int ,int);void main()int a=5,b=7; swap(a,b); printf("a=%d,b=%dt", a,b);void swap(int x, int y) int t; t=x; x=y; y=t; printf("x=%d, y=%dt", x,y);2.下面程序的运行结果是:#include <stdio.h>void swap(int *,int *);void main()int a=5,b=7; swap(&a,&b); printf("a

5、=%d,b=%dt", a,b);void swap(int *x, int *y) int t; t=*x; *x=*y; *y=t; printf("x=%d, y=%dt", *x,*y);3. 下面程序段的运行结果是: char s20=“abcd”; char *p = s; p+; puts(strcat(p, “ABCD”)4. 下面程序的运行结果是:#include <stdio.h>void main() char *strc( char *str1, char *str2); char s180 ="computer&qu

6、ot; , s2="language", *pt; pt = strc(s1,s2); printf("%sn", pt);char *strc( char *str1, char *str2) char *p; for(p=str1; *p!='0' p+) do *p+ = *str2+ ; while(*str2!= '0') ; *p='0' return str1;5. 若有以下输入 1,2<CR>,则下面程序的运行结果是:#include <stdio.h>void ma

7、in() int a23=2,4,6,8,10,12; int (*p)3, i, j; p=a; scanf("%d,%d", &i, &j); printf("a%d%d=%dn" , i, j, *(*(p+i)+j);第二部分:实验实验(一)龟兔赛跑1实验目标在本实验中,学生将实验:þ 传址调用,子函数能直接修改主调函数中的数据在强化练习中,学生将实践þ 比较传值调用与传址调用函数的区别。在传值调用函数中,传递的是参数的副本,而在传引用调用函数中,传递的是参数的地址。þ 复引用指针(*指针名)以访问存

8、储在特定内存地址的数据。2实验描述本程序模拟龟兔赛跑问题。程序将采用生成随机数的方法开发这一问题的仿真程序。在此比赛中共设了70个点,每个点代表比赛跑道中可能的一个位置。乌龟和兔子从第1个点出发,终点是在第70个点上。时钟按秒来计算。随着时钟的移动,程序能够根据下述规则来调节乌龟和兔子的位置。动物跑动类型占用时间跑动量乌龟快走后滑慢走502030向右3个点向左6个点向右1个点兔子睡觉大后滑快走小步跳慢后滑2020103020不动向左9个点向右12个点向右1个点向左2个点动物从位置1(起跑线)开始比赛。如果动物从点1处向左移动,那么就将此动物重新放回点1的位置。随着时钟的转动(每次重复循环),打

9、印出乌龟所在的位置和兔子所在的位置,分别以T和H表示。在某些偶然的情况下,参赛者会位于同一点上,在这种情况下,是乌龟赢了兔子。程序应在这一位置上打印“”。除了“T”“H”“”外的所有的打印位置都是空白的。打印完每一行后,测试一下两个动物是否己经达到或超过点70位置。如果超过,就将获胜者的名字打印出来,并终止程序的模拟过程。如果乌龟赢了,那么打印“TORTOISE WINS! YAY!”,如果兔子赢了,打印“Hare wins. Yuch.”。如果两个动物都没有赢,那么重新执行循环,模拟下一轮的情况。 3输出结果。4问题解决技巧(1) 变量tortoise和变量hare分别存储了乌龟和兔子的当前

10、位置(声明为170的整型数)。这两个变量都为main所有,但程序希望在函数调用(如moveT和moveH)过程中时对其进行修改,因此它们必须采用传址方式。(2) 对指针所访问的数据引用应用形式“*指针名”。(3) 程序中要生成一个随机整数i来表示描述中的百分比,i的范围为1<=i<=10。对于乌龟而言,当1<=i<=5时为快走,当6<=i<=7时为后滑,当8<=i<=10时为慢走。兔子的跑动方式与其类似。(4) 因程序运行结果较长,TC2.0受结果窗口的限制只能看到最后面的部分结果,若在c-free下运行可看到完整的运行结果。5. 程序模板/*r

11、ace.c*/#include <stdio.h>#include <stdlib.h>#include <time.h>#define RACE_END 70/*函数moveT的声明*/*函数moveH的声明*/*函数printCP的声明*/void main() int tortoise =1 , hare =1 , timer = 0; srand(time(0); printf("ON your mask, Get setnBang!nAND they're off !n"); while(tortoise!= RACE_

12、END && hare != RACE_END) /*调用函数moveT*/ /*调用函数moveH*/ /*调用函数printCP*/ +timer; if(tortoise >= hare) printf("nTortoise wins! YAY!n" ); else printf("Hare wins . Yuch.n"); printf("Total %d seconds.n" ,timer);/*编写函数moveT的定义头部*/ int x=1+rand()%10; if(x>=1 &&a

13、mp; x<=5) /快走 *pT += 3; else if (x>=6 && x<=7) /后滑 *pT -= 6; else (*pT)+; /慢走 if( *pT <1 ) *pT = 1; else if(*pT > RACE_END) *pT = RACE_END;/*编写函数moveH定义头部*/ int x = 1 +rand() % 10; /*编写语句移动兔子*/ /*编写语句测试兔子是否还没开始起跑或者超出终点,处理这种情况*/*编写函数printCurrentPosition定义*/ int i; if(*pT = *pH)

14、 /*编写语句,打印兔子和乌龟的位置*/ else if(*pT < *pH) /*编写语句,打印兔子和乌龟的位置*/ else /*编写语句,打印兔子和乌龟的位置*/ printf("n") ;6强化练习(1) 这里的龟兔赛跑问题能否用传值调用函数来模拟?为什么用传址调用函数更方便?(2) 当用指针引用其访问的数据时,如果忘记写“*”,会发生什么情况?这是语法错误吗?请说明这种错误的后果。(3) 下面的语句有何错误?int *p_race = 70;实验(二)洗牌和发牌1实验目标在本实验中,学生将实验:þ 函数之间传递二维数组þ 函数之间传递指针

15、数组þ 访问字符串的指针数组定义和初始化2实验描述本程序模拟洗牌和发牌的动作。一幅扑克牌有四种花色,每个花色有113个面值,共有52张牌。程序中的suit数组指向四种花色: Hearts(红心)、 Clubs(草花)、Diamonds(方片)、Spades(黑桃)。程序中的shuffle函数模拟了洗牌操作,将4×13张牌指定一个洗牌后的发牌序号(152)。要求补充完整程序。3输出结果4程序模板/*shuffle.c */#include <stdio.h>#include <string.h>#include <time.h>#inclu

16、de <stdlib.h>/*编写函数deal的函数原型*/;void shuffle(int 13);void main() char *suit4="Hearts", "Clubs","Diamonds","Spades" char *face13="A","2","3","4","5","6","7","8","9",&

17、quot;10","J","Q","K" /*编写语句定义数组color,并指向两个字符串“Red”和“Black”*/; int deck413=0; shuffle(deck); deal(deck, face , suit ,color);void deal(int sDeck13, char *sFace, char *sSuit,char *sColor) int card, row, column; for(card=1; card<=52 ; card+) for(row=0; row<=3; ro

18、w+) for(column=0; column<=12 ; column+) if(sDeckrowcolumn = card) printf("%10s of %10s ", sFacecolumn, sSuitrow) ; /*编写语句,显示该牌面是红色还是黑色*/; /*编写语句,判断是否需要显示代表人头的星号,如果需要显示出来*/; printf("%s", (card%2 =0 )? "n" :"t"); void shuffle(int sDeck13) int card,row,column,

19、i=0; srand(time(0); for(card =1; card<=52; card+) do row = rand()% 4; column = rand()%13; while(sDeckrowcolumn!=0); sDeckrowcolumn= card ; 5问题解决技巧(1) 数组deck中存放的是4×13 张扑克的发排顺序号。(2) 数组suit指定了4种花色的顺序,即Hearts(红心)对应着数组deck的第1行、 Clubs(草花)对应着数组deck的第2行、Diamonds(方片)对应着数组deck的第3行、Spades(黑桃)对应着数组deck的

20、第4行(3) color数组的初始化颜色顺序与suit花色的顺序有关。实验(三)查找子串1实验目标在本实验中,学生将实验:þ 访问函数的指针(函数指针)应用,函数指针的定义、赋值和调用þ 返回指针的函数(指针函数)应用,返回一个地址2实验描述main函数给出两个串string1和sting2,调用函数finds实现这样的功能:在串string1中查找是否包含有子串string2,如果找到第1个sting2则返回其所在位置(string2第0个字符的地址),如果没有找到则返回NULL。3输出结果4问题解决技巧设计如下算法实现子串的查找:从sting1的第1个字符开始遍历,每指

21、向一个字符时,将从该字符开始的n个字符与串string2的n个字符依次比较是否相同。如果比较发现一对字符不相同则将I后移一个位置,准备比较从I+1位置开始的n个字符。如果比较到了string2的末尾0,说明从当前位置I开始找到了一个与串string2相同的子串,则将I的位置返回主调函数。如图所示,可设置I,j,k三个变量,I指示每次开始比较的子串的首位置。j和k的变化是同步的,比较sting1j和string2k是否相等。5程序模板/*findsub.c*/#include <stdio.h>char * finds(char *, char *);void main() char

22、 string180, string280,*q; /*指针q用来接收函数调用的返回值*/ /*编写语句,定义访问finds函数的指针变量pf*/ printf("enter your string:n"); gets(string1); printf("enter your substing:n"); gets(string2); /*编写语句实现将指针pf指向函数finds*/ q=/*编写语句实现用指针向finsd函数传递参数string1和string2*/ if(q=NULL) printf("There is no string %

23、s.n", string2); else printf("your sub string is at location %dn", q-string1+1);char *finds(char *s1, char *s2)/*编写函数体语句,实现子串的查找功能并返回其地址*/6强化练习 若程序要统计给出的主串中所包含子串的个数,请重新编写程序完成功能。实验(四)调试本部分程序是调用output函数数出5个国家名。程序编译运行出现错误,请比较输出结果与正确的实例输出,对可能存在的逻辑错误或者语法错误进行修改。1. 正确的实例输出2. 错误的程序代码/*debug.c*

24、/#include <stdio.h>void output(char *p, int row) int i; for(i=0;i<row;i+) puts(pi);void main() char array520="Hongkang","China","America","Japan","Germen" printf("nyour country is:n"); output(array,5);第三部分:测试(一)选择1 下面四组对指针变量操作的语句,正

25、确的判断选项是 _ 。 (1) int *p, *q ; p=q;int x, *p ,*q; p=q=&x;(2) int x, *p ,*q; p=&x ; q= *p ;int x=30, *p ; *p=x ;(3) int x=y=3, *p ; p=&x ; y=*p; int x=20, *p, *q=&x ; *p = *q;(4) int x=30; *p, *q=&x ; p=q; int p, *q; q=&p;A) 正确(1);不正确(2)(3)(4)B) 正确(1)(4);不正确(2)(3)C) 正确(3);不正确(1)

26、(2)(4)D) 正确(4);不正确(1)(2)(3)2 以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是 _ 。void main() int *p, x; p=&x; printf(“enter x:n”); scanf(“%d”, *p); . A) *p表示指针变量p的地址B) *p表示变量x的值而不是x的地址C) *p表示的是指针变量p的值D) *p中的*只能做标识符不能做运算符3 下面程序段有错误,错误原因是 _ 。int *p, x ;char *q, ch;q= &ch;p= &x;*p=30;*q=*p;A) *p表示地址,因此

27、不能执行 *p=30;B) q没有指向具体的存储单元,所以*q没有实际意义C) p和q的类型不一致,所以不能执行 *q= *p;D) q虽然指向了具体的存储单元,但该单元中没有确定的值,所以不能执行 *p= *q;4 若有图1所示的存储结构,如果要实现图2所示的存储结构则正确的赋值语句是_ 。A) *q= *p;B) q = p;C) q = *p;D) *q = p;5若有说明:int *p, a=5, b; 以下正确的程序段是 _ 。A) p=&b ; scanf(“%d”, &p); B) p=&b; scanf(“%d”,*p);C) scanf(“%d”, &

28、amp;b); *p=b;D) p=&b; *p=a;6下面正确的说法是 _ 。A) char *p=“china”;等价于 char *p ; *p=“china”;B) char s10=“china”; 等价于char s10; s =“china”;C) char *p=“china”; 等价于 char *p ; p=“china”;D) char s15=“china”, s2=“china”; 等价于char s1=s2=“china”;7下面程序的运行结果是 _。char *q=“germen”;q=q+3; printf(“%d”,q);A) men B)字符m C)

29、不确定的值D)字符m的地址8设有程序段:char a=”china”; char *p; p=a ;则下面叙述正确的是 _ 。 A) a 和p完全相同B) 数组a中的内容和指针变量p中的内容相同C) 指针变量p中存放的是字符cD) a0与*p相同9下面正确的程序段是 _。A) char s10; scanf(“%s”, &s);B) char *p; scanf(“%s”, p);C) char s10; scanf(“%s”, &s2);D) char s10, *p=&s; scanf(“%s”, p2);10下面正确的程序段是 _。A) char s1=“123”

30、, s2=”abcdef”; strcpy(s1,s2);B) char s10, *p = “abcde”; strcat(s, p);C) char s10= “ ”, *p=“abcde”; strcat(s, p);D) char *p1=“12345”, *p2=“abcde”; strcat(p1,p2);11下面程序段的运行结果是 _。char *p=“abcdefgh”;p+=3; printf(“%d”, strlen(strcpy(p, “ABCD”);A) 8B)12C)4D)712下面程序段的运行结果是 _。char a=“language”, *p;p=a;while

31、(*p != u) printf(“%c” , *p-32 ); p+ ;A) LANGUAGEB)languageC)LANGD)langUAGE13若有说明语句 char a=”It is mine”; char *p=”It is mine”;则以下不正确的叙述是 _。A) a+1表示的是字符t的地址B) p指向另外的字符串时,字符串的长度不受限制C) p变量中存放的地址值可以改变D) a中只能存放10个字符14若已定义char s10;则在下面表达式中不表示s1的地址的是 _。A)s+1 B)s+ C)&S0+1D)&S115若有以下定义,则对数组a元素的正确引用是 _

32、。int a5, *p=a;A)*&a5 B)a+2 C)*(p+5)D)*(a+2)16若有以下定义,则对数组a元素地址的正确引用是 _。int a5, *p=a;A)p+5 B)*a+1 C)&a+1D)&a017若有定义:int a23;则对数组a的第i行第j列元素值的正确引用为 _。A) *(*(a+i)+j) B)(a+i)jC)*(a+i+j)D)*(a+i)+j18若有定义:int a23;则对数组a的第i行第j列元素地址的正确引用为 _。A) *(ai+j) B)(a+i)C)*(a+j)D)ai+j19. 若有以下定义和语句,则对数组a元素地址的正确引

33、用为 _。int a23, (*p)3;p=a;A) *(p+2) B)p2C)p1+1D)(p+1)+220. 若有以下定义和语句,则对数组a元素地址的正确引用为 _。int a23, (*p)3;p=a;A)(p+1)0 B)*(*(p+2)+1)C)*(p1+1)D)p1+221. 若有定义:int (*p)4 ; 则标识符p _。A) 是一个指向整型变量的指针B) 是一个指针数组名C) 是一个指针,它指向一个含有四个整型元素的一维数组D) 定义不合法22. 以下与int *q5;等价的定义语句是 _。A)int q5; B)int *q; C)int *(q5) ;D)int (*q)

34、5;23. 若有定义:int *p4 ; 则标识符p _。A) 是一个指向整型变量的指针B) 是一个指针数组名C) 是一个指针,它指向一个含有四个整型元素的一维数组D) 定义不合法24. 若有以下定义,且0<=i<6,则正确的赋值语句是 _。int s46, t64, (*p)6;A)p=t ; B)p=s; C)p=si;D)p=ti;25. 若要对a进行 运算,则a应具有下面说明 _。A)int p3; B)int k; C)char *a3; D)int b10; int *a=p; int *a=&k;int *a=b+1;26. 以下选项中,对指针变量p的正确操作

35、是 _。A)int a5, *p;B)int a5, *p; C)int a5; D)int a5; p = &a; p=a; int *p =a=100; int *p1, *p2=a; *p1=*p2;27. 若有定义:int a=2,4,6,8,10,12,14,16,18,20,22,24, *q4, k ;则下面程序段的输出是 _。for(k=0; k<4; k+) qk=&ak*3; printf(“%d”, q30);A)8B)16 C)20 D)结果不确定28. 若有以下定义: char *a2=“1234”, “5678”;则正确的叙述是 _。A) a数

36、组的两个元素中各自存放了字符串“1234”和“5678”的首地址B) a数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址C) a是指针变量,它指向含有两个数组元素的字符型一维数组D) a数组元素的值分别是“1234”和“5678”29. 若有以下定义:int s43=1,2,3,4,5,6,7,8,9,10,11,12 ;int (*p)3=s;则能够正确表示数组元素s12的表达式是 _。A) *(*p+1)2) B)(*p+1)+2C)*(*(p+5)D)*(*(p+1)+2)30. 若有说明:char *language=“FORTRAN”, “BASIC”, “PASCAL”, “JAVA”, “C”;则表达式*language1>*language3比较的是 _。A) 字符F和字符P B)字符串BASIC和 JAVAC) 字符B和字符JD) 字符串FORTRAN和 PASICAL31. 若有说明:char *language=“FORTRAN”, “BASIC”, “PASCAL”, “JAVA”, “C”;则language2的值是 _。A) 一个字符 B)一个地址C) 一

温馨提示

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

评论

0/150

提交评论