找回密码
 注册

QQ登录

只需一步,快速开始

查看: 760|回复: 0

大工20春《c&c 语言程序设计》十二

[复制链接]
发表于 2021-2-25 11:31:23 | 显示全部楼层 |阅读模式
C/C++语言程序设计辅导资料十二
一、主题:指针二、学习时间:2020年6月15日-6月21日“不忘初心、牢记使命”主题理论学习:
守初心,就是要牢记全心全意为人民服务的根本宗旨,以坚定的理想信念坚守初心,牢记人民对美好生活的向往就是我们的奋斗目标;以真挚的人民情怀滋养内心,时刻不忘我们党来自人民、根植人民,人民群众的支持和拥护是我们胜利前进的不竭力量源泉;以牢固的公仆意识践行初心,永远铭记人民是共产党的衣食父母,共产党人是人民的勤务员,永远不能脱离群众、轻视群众、漠视群众疾苦。
摘选自《在“不忘初心、牢记使命”主题教育工作会议上的讲话》三、知识脉络:
第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
南开答案可以联系QQ 761296021

QQ|手机版|小黑屋|网站地图|无忧答案网 ( 冀ICP备18010495号-1 )

GMT+8, 2024-5-4 12:14

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表