|  | 
 
| C/C++语言程序设计辅导资料十二 一、主题:指针二、学习时间:2020年12月14日-12月20日“不忘初心、牢记使命”主题理论学习:
 守初心,就是要牢记全心全意为人民服务的根本宗旨,以坚定的理想信念坚守初心,牢记人民对美好生活的向往就是我们的奋斗目标;以真挚的人民情怀滋养内心,时刻不忘我们党来自人民、根植人民,人民群众的支持和拥护是我们胜利前进的不竭力量源泉;以牢固的公仆意识践行初心,永远铭记人民是共产党的衣食父母,共产党人是人民的勤务员,永远不能脱离群众、轻视群众、漠视群众疾苦。
 摘选自《在“不忘初心、牢记使命”主题教育工作会议上的讲话》三、知识脉络:
 第8章 指针
 8.3 指针与函数
 8.4 指针与字符串
 8.5 字符串函数四、学习要求:
 掌握指针向函数传递数据的方法
 理解按地址传递的特点
 理解数组名作参数的本质
 了解返回地址的方法
 理解字符串类型
 掌握指针指向字符串的方法
 理解指针与数组操作字符串的区别
 掌握字符串输入输出函数gets()/puts()
 掌握求字符串长函数strlen()的用法
 掌握字符串复制函数strcpy()的用法
 掌握字符串比较函数strcmp()的用法
 掌握字符串连接函数strcat()的用法五、重点难点:
 按地址传递参数
 返回指针
 指向字符串的指针
 字符串函数
 
 六、主要内容:
 1.指针与函数
 指针作函数参数
 void swap( int *pi1Copy,int *pi2Copy)
 {  int *piTemp;
 piTemp=pi1Copy;
 pi1Copy=pi2Copy;
 pi2Copy=piTemp;
 }
 int main()
 {
 int i1=3,i2=4;
 int *pi1=&i1,*pi2=&i2;
 swap( pi1,pi2);
 printf("i1=%d\ni2=%d\n",i1,i2);
 return 0;
 }
 
 数组名作参数,按地址方式传递给函数
 
 形参数组并不存在连续的存储空间,仅为一个指针变量。
 形参数组名是指针变量,并不一定存放一个固定的地址值。
 在函数调用开始时,它接收了实参数组首元素的地址,但在函数执行期间,它可以再被赋值,即其值可变。
 # include <stdio.h>
 void test ( int ap [] ,  double bp [] , char cp [] )
 {  printf( "sizeof ( ap )  =%d \n“, sizeof (ap ) ) ;
 printf( "sizeof ( bp )  =%d \n“, sizeof (bp ) ) ;
 printf( "sizeof ( cp )  =%d \n“, sizeof (cp ) ) ;
 }
 void main()
 {   int  a [  ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ;
 double  b [ 10 ] = { 0.1,  0.2,  0.3,  0.4,  0.5} ;
 char  c [ ] = “123456789” ;
 printf( "sizeof ( a )  =%d \n“, sizeof ( a ) ) ;
 printf( "sizeof ( b)  =%d \n“,  sizeof ( b) ) ;
 printf( "sizeof ( c )  =%d \n“, sizeof ( c ) ) ;
 test ( a, b, c ) ;
 }
 2.指针与字符串
 字符指针与字符数组
 字符指针指向一个字符串
 字符数组存放一个字符串
 字符指针变量:给指针变量分配内存单元,在其中可以放一个字符变量的地址。
 字符数组:在编译时为它分配内存单元,它有确定的地址和连续的内存空间。
 字符指针变量指向的字符串中的内容是不变的
 字符数组中各元素的值是可以改变的
 例 通过指针变量访问字符数组
 char cArr[11]="C Language",  *pc ;
 for( pc = cArr; pc<cArr+10; pc++)
 printf("%c", *pc);
 pc=cArr; /*指针复位*/
 for(i=0; i<10; i++, pc++)
 printf(“%s\n”, pc );
 3.字符串函数
 字符串输出函数  int puts ( char *pc );
 把字符指针指定的字符串输出到标准输出流中,空字符'\0'不输出,但是输出一个换行符。
 pc可以使指针变量,也可以是字符数组名。
 若出现写错误,则返回EOF(-1),否则返回非负数。
 字符串输入函数  char * gets( char *pc);
 从标准输入流读字符到字符指针指定的字符数组中,直到遇到换行符或输入文档结束符,并且丢弃换行符或结束符,然后在字符数组中添加一个空字符'\0'。
 pc必须是字符数组名或指向字符数组的指针变量,不可以使用指针变量指向字符串常量。
 若成功,返回pc;若直接遇见结束符,pc所指数组不变,返回空指针;若读入长度超出数组长度,数组改变,会出现内存写问题(超出数组长度)。
 字符串长度  int strlen (char * pc );
 计算pc所指向的串的长度。
 可以使指针变量,也是字符数组名
 返回pc指向数组长度,空字符之前的字符个数
 字符串复制  char * strcpy ( char * pc 1 , char * pc 2 );
 把字符指针pc2所指向的串(包括结尾的空字符在内)复制到pc1所指向的字符数组。
 pc1必须是字符数组名或指向字符数组的指针变量,不可以使用指针变量指向字符串常量;pc2可以使指针变量,也可以是字符数组名。
 返回pc1,若复制后的pc1长度超出pc1指向数组长度,会出现内存写问题。
 字符串连接  char * strcat ( char * pc 1 , char * pc 2 ) ;
 把字符指针pc1所指向的字符数组的末尾添加pc2所指向的串(包括结尾的空字符在内)的副本,pc2所指向的串的第一个字符覆盖pc1所指向的串末尾的空字符。
 pc1必须是字符数组名或指向字符数组的指针变量,不可以使用指针变量指向字符串常量;pc2可以使指针变量,也可以是字符数组名。
 返回p1;若连接后的pc1长度超出pc1指向数组长度,会出现内存写问题(超出数组长度)。
 字符串比较  int strcmp (char * str 1 , char * str 2 );
 按ASCII码顺序比较字符指针所指向字符串的大小
 七、习题:
 1.有以下定义
 char a[10],*b=a;
 不能给数组a输入字符串的语句是()。
 A.gets(a)
 B.gets(a[0])
 C.gets(&a[0])
 D.gets(b)
 答案:B2.下面程序段的运行结果是_________。
 char *s="abcde";
 s+=2;printf("%d",s);
 A.cde
 B.字符'c'
 C.字符'c'的地址
 D.无确定的输出结果
 答案:C3.以下程序段中,不能正确赋字符串(编译时系统会提示错误)的是()。
 A.char s[10]="abcdefg";
 B.char t[]="abcdefg",*s=t;
 C.char s[10];s="abcdefg";
 D.char s[10];strcpy(s,"abcdefg");
 答案:C4.设已有定义: char *st="how are you"; 下列程序段中正确的是()。
 A.char a[ ], *p;   strcpy(p=a+1,&st[4]);
 B.char a[11];   strcpy(++a, st);
 C.char a[11];   strcpy(a, st);
 D.char a[], *p;    strcpy(p=&a[1],st+2);
 答案:A、C5.有以下程序
 main()
 {
 char a[]="programming",b[]="language";
 char *p1,*p2;
 int i;
 p1=a;p2=b;
 for(i=0;i<7;i++)
 if(*(p1+i)==*(p2+i))
 printf("%c",*(p1+i));
 }
 输出结果是()。
 A.gm
 B.rg
 C.or
 D.ga
 答案:D6.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是________。
 A.c=*p1+*p2
 B.p2=c
 C.p1=p2
 D.c=*p1*(*p2)
 答案:B7.以下正确的程序段是_________。
 A.char str[20]; scanf("%s",&str);
 B.char *p; scanf("%s",p);
 C.char str[20]; scanf("%s",&str[2]);
 D.char str[20],*p=str; scanf("%s",p[2]);
 答案:C8.若有说明语句
 char a[]="It is mine";
 char *p="It is mine";
 则以下不正确的叙述是________。
 A.a+1表示的是字符t的地址
 B.p指向另外的字符串时,字符串的长度不受限制
 C.p变量中存放的地址值可以改变
 D.a中只能存放10个字符
 答案:D9.下面程序的运行结果是_______。
 #include  <stdio.h>
 #include  <string.h>
 main()
 {  char *s1="AbDeG";
 char *s2="AbdEg";
 s1+=2;s2+=2;
 printf("%d\n",strcmp(s1,s2));
 }
 A.正数
 B.负数
 C.零
 D.不确定的值
 答案:B10.有以下程序
 #define N 8
 void f(int *x, int *y)
 {
 int t;
 t=*x;*x=*y;*y=t;
 }
 int main()
 {
 int a[N]={1,2,3,4,5,6,7,8},i,*p,*q;
 p=a;
 q=&a[N-1];
 while(p<q)
 {
 f(p,q);
 p++; q--;
 }
 for(i=0;i<N;i++)
 printf("%d,",a[i]);
 return 0;
 }
 程序运行后的输出结果是______。
 A.8,2,3,4,5,6,7,1,
 B.5,6,7,8,1,2,3,4,
 C.1,2,3,4,5,6,7,8,
 D.8,7,6,5,4,3,2,1,
 答案:D11.已定义以下函数
 fun (int *p)
 {  return  *p;  }
 该函数的返回值是
 A.不确定的值
 B.形参p中存放的值
 C.形参p所指存储单元中的值
 D.形参p的地址值
 答案:C12.有以下程序
 int f(int b[][4])
 { int i,j,s=0;
 for(j=0;j<4;j++)
 {  i=j;
 if(i>2)  i=3-j;
 s+=b[i][j];
 }
 return s;
 }
 main( )
 { int a[4][4]={{1,2,3,4},{0,2,4,5},{3,6,9,12},{3,2,1,0}};
 printf("%d\n",f(a) );
 }
 执行后的输出结果是
 A.12
 B.11
 C.18
 D.16
 答案:D13.若有以下函数首部
 int  fun(double  x[10], int  *n)
 则下面针对此函数的函数声明语句中正确的是
 A.int  fun(double x, int *n);
 B.int  fun(double  , int );
 C.int  fun(double *x, int n);
 D.int  fun(double *,  int [] );
 答案:D14.下段代码的运行结果是:
 int main()
 {
 char a;
 char *str=&a;
 strcpy(str,"hello");
 printf(str);
 return 0;
 }
 A.hello
 B.null
 C.h
 D.发生异常
 答案:D15.下段程序的运行结果是 :
 void main()
 {
 char *p,*q;
 char str[]="Hello,World\n";
 q = p = str;
 p++;
 print(q);
 print(p);
 }
 void print(char *s)
 {
 printf(“%s”,s);
 }
 A.H    e
 B.Hello,World      ello,World
 C.Hello,World     Hello,World
 D.ello,World     ell,World
 答案:B16.有以下程序
 void fun(char *c,int d)
 {
 *c=*c+1;
 d=d+1;
 printf("%c,%c,",*c,d);
 }
 void  main()
 {
 char a='A',b='a';
 fun(&b,a);
 printf("%c,%c\n",a,b);
 }
 程序运行后的输出结果是______。
 A.B,a,B,a
 B.a,B,a,B
 C.A,b,A,b
 D.b,B,A,b
 答案:D17.若有函数max(a,b),并且已使函数指针变量p指向函数max,当调用该函数时,正确的调用方法是_______。
 A.(*p)max(a,b);
 B.*pmax(a,b);
 C.(*p)(a,b);
 D.*p(a,b);
 答案:C18.对于语句int *pa[5];下列描述中正确的是_______。
 A.pa是一个指向数组的指针,所指向的数组是5个int型元素
 B.pa是一个指向某数组中第5个元素的指针,该元素是int型变量
 C.pa [5]表示某个元素的第5个元素的值
 D.pa是一个具有5个元素的指针数组,每个元素是一个int型指针
 答案:D19.若有以下定义,且0≤i<4,则不正确的赋值语句是_______。
 int b[4][6], *p, *q[4];
 A.q[i] = b[i];
 B.p = b;
 C.p = b[i]
 D.q[i] = &b[0][0];
 答案:B20.若要对a进行++运算,则a应具有下面说明_______。
 A.int a[3][2];
 B.char *a[ ] = {“12”,”ab”};
 C.float a[3];
 D.int b[10], *a = b;
 答案:D
 本内容由易百教育整理发布
 网址www.openhelp100.com
 QQ 515224986
 
 | 
 |