资源描述:
《C语言教材 第七章 指针 实验.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、第七章指针第一部分知识训练【知识要点】1.地址与指针指针变量的概念:用一个变量专门来存放另一个变量的地址。2.指向变量的指针变量指针变量的形式:基类型*指针变量名;&:取地址运算符;*:指针运算符。3.指针与数组引用一个数组元素可以用下标法和指针法;可以用数组名作函数的参数。4.指针与函数函数指针变量定义的一般形式为:类型说明符 (*指针变量名)();一个函数的返回值可以是一个函数。【典型习题与解析】5. char*constp;charconst*p constchar*p 上述三个有什么区别?【
2、解析】char*constp;//常量指针,p的值不可以修改; charconst*p;//指向常量的指针,指向的常量值不可以改; constchar*p;//和charconst*p。6. main(){ inta[5]={1,2,3,4,5}; int*ptr=(int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); } 输出结果是什么? 【解析】 答案:输出:2,5 *(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5
3、。 &a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)。 int*ptr=(int*)(&a+1);则ptr实际是&(a[5]),也就是a+5。 原因如下:1)&a是数组指针,其类型为int(*)[5];而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。2)a是长度为5的int数组指针,所以要加5*sizeof(int),所以ptr实际是a[5], 但是prt与(&a+1)类型是不一样的(这点很重要),所以prt-1只会减去
4、sizeof(int*) a,&a的地址是一样的,但意思不一样。3)a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]。【练习题】一、填空题1.指针变量是把内存中另一个数据的作为其值的变量。2.能够直接赋值给指针变量的整数是。3.如果程序中已有定义:intk;1) 定义一个指向变量k的指针变量p的语句是。2) 通过指针变量,将数值6赋值给k的语句是。3) 定义一个可以指向指针变量p的变量pp的语句是。
5、4) 通过赋值语句将pp指向指针变量p的语句是。5) 通过指向指针的变量pp,将k的值增加一倍的语句是。4.当定义某函数时,有一个形参被说明成int*类型,那么可以与之结合的实参类型可以是、等。5.以下程序的功能是:将无符号八进制数字构成的字符串转换为十进制整数。例如,输入的字符串为:556,则输出十进制整数366。请填空。#includemain(){char*p,s[6];intn;p=s;gets(p);n=*p-‵0‵;while(!=' ')n=n*8+*p-‵0‵
6、;printf("%d",n);}二、选择题1.变量的指针,其含义是指该变量的()。 A)值 B)地址 C)名 D)一个标志2.下面程序的运行结果是()。 #include #include main() { char*s1="AbDeG"; char*s2="AbdEg"; s1+=2;s2+=2; printf("%d",strcmp(s1,s2)); } A)正数 B)负数 C)零
7、D)不确定的值3.若有以下定义,则对a数组元素的正确引用是()。inta[5],*p=a;A)*&a[5] B)a+2 C)*(p+5) D)*(a+2)4.若有以下定义,则p+5表示()。int a[10],*p=a;A)元素a[5]的地址 B)元素a[5]的值C)元素a[6]的地址 D)元素a[6]的值5.以下Delblank函数的功能是删除字符串s中的所有空格(包括Tab、回车符和换行符)。voidDelblank(char*s){inti,t;charc
8、[80];for(i=0,t=0;①;i++)if(!isspace(②))c[t++]=s[i];c[t]=‘ ’;strcpy(s,c);}①A)s[i]B)!s[i]C)s[i]=‘ ’D)s[i]==‘ ’②A)s+iB)*c[i]C)*(s+i)=‘ ’D)*(s+i)6.以下conj函数的功能是将两个字符串s和t连接起来。char*conj(char*s,char*t){char*p=s;while(*s)①;while(*t){*s=②;s++;