版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言指针期试题及答案考试时间:______分钟总分:______分姓名:______一、选择题(每小题2分,共20分)1.若有定义`int*p,a=10,b;`,则下列赋值语句中错误的是()。A.p=&a;B.b=*p;C.p=b;D.*p=&b;2.以下关于指针的说法中,正确的是()。A.指针是一个变量,可以存放任何数据B.指针运算的结果一定是另一个内存地址C.定义指针变量必须为其分配内存空间D.`int*p;`与`int*p=NULL;`在定义指针变量p时是等价的3.若有定义`charstr[]="China",*p;`,则语句`p=str;`执行后,下列说法中正确的是()。A.p指向的是字符串常量"China"的第一个字符'C'的地址B.p指向的是字符数组str的首地址C.字符串"China"存储在p所指向的内存区域D.语句执行后,p的值为常量04.以下关于数组与指针的说法中,正确的是()。A.数组名是数组元素的地址B.数组名是数组首元素的地址,且该地址在程序运行期间不可改变C.通过数组名和下标访问数组元素,实际上就是进行两次指针运算D.数组名可以作为函数参数传递,且传递的是数组的全部元素5.下列关于函数调用方式的说法中,正确的是()。A.只能使用值传递方式调用函数B.只能使用地址传递方式调用函数C.可以使用值传递和地址传递方式调用函数,但地址传递效率更高D.使用地址传递方式调用函数时,函数内部对形参的修改不会影响实参的值6.若有定义`inta=5,b=10,*pa=&a,*pb=&b;`,则表达式`*pa+*pb`的值是()。A.15B.5C.10D.地址相加的结果7.以下关于指针与函数的说法中,正确的是()。A.函数的形参可以是任何类型的指针变量B.函数的返回值可以是任何类型的指针变量C.不能通过函数返回局部变量的地址D.函数内部定义的指针变量在函数调用结束后自动消失,其所指向的内存空间也会被释放8.以下代码片段中,正确的是()。```cint*p1,*p2;p1=(int*)malloc(sizeof(int)*10);p2=p1+5;//假设p1已正确指向一块连续的内存```A.代码执行后,p1指向的是p1初始指向内存的下一个整数地址B.代码执行后,p2指向的是p1初始指向内存的第六个整数地址C.使用malloc分配内存后,如果未初始化,则*p1和*p2的值是不确定的D.p1+5的操作与p1指向的内存大小有关9.以下代码片段中,存在安全隐患的是()。```cint*p=(int*)malloc(sizeof(int)*5);if(p!=NULL){*p=100;//...使用p...free(p);//可能忘记free,或free了两次p=NULL;//可能忘记将p置为NULL//...继续使用p...free(p);//释放已经指向NULL的指针}```A.将p置为NULL的操作B.释放已经指向NULL的指针的操作C.忘记free(p)的操作D.忘记将p置为NULL的操作10.若有定义`structNode{intdata;structNode*next;};`,则以下说法中正确的是()。A.structNode是一个基本数据类型B.structNode*p;定义了一个指向结构体变量本身的指针C.structNode*p=(structNode*)malloc(sizeof(structNode));;创建了一个链表节点D.在C语言中,结构体指针只能指向结构体变量,不能指向结构体数组二、填空题(每空2分,共20分)1.若有定义`intx=8,*px=&x;`,则表达式`*px+5`的值是________,表达式`px+1`的值是________(假设px指向的内存地址加1后的地址是有效的整型地址)。2.以下代码段的功能是计算一个整型数组元素的和,请将下划线处补充完整。```cintarr[5]={1,2,3,4,5};intsum=0;int*p=arr;//或p=&arr[0];while(_______){sum+=*p;p++;}```3.以下代码段定义了一个指向字符型数组的指针,并初始化指向字符串"Hello",请将下划线处补充完整。```cchar*s="Hello";//s=________;//或charstr[]="Hello";s=str;```4.若函数声明为`voidswap(int*a,int*b);`,则调用`swap(&x,&y);`的目的是交换变量x和y的值,函数swap内部实现交换逻辑。若想通过调用swap函数使得`inta=3,b=5;`变为`a=5,b=3;`,则swap函数体中关于a和b的值进行交换的操作通常使用________语句实现。5.以下代码片段定义了一个指针数组,用于存储三个字符串的地址,请将下划线处补充完整。```cchar*names[]={"Apple","Banana","Cherry"};charp=________;//p指向names数组的首地址printf("%s\n",p[1]);//输出Banana```6.若要动态分配一个能存储100个整数的数组,并让指针p指向该数组的首地址,应使用________函数,并确保在使用完毕后使用________函数释放该内存空间。7.在C语言中,如果一个指针变量p在声明后没有被赋予任何有效的地址(包括NULL),直接使用`*p`解引用该指针可能会导致________错误。8.以下代码片段定义了一个单向链表的头指针head,并创建了一个新节点newNode,请将下划线处补充完整,以将newNode插入到链表的头部。```cstructNode{intdata;structNode*next;};structNode*head=NULL,*newNode=(structNode*)malloc(sizeof(structNode));newNode->data=10;newNode->next=________;//newNOde不指向任何节点head=________;//head指向新节点```9.以下代码片段使用了指针函数,该函数返回一个指向int类型数据的指针,请将下划线处补充完整。```cint*createInt(){return(int*)malloc(sizeof(int));//或返回一个已存在的int变量的地址}int*p=createInt();*p=42;```10.以下代码片段试图释放一个动态分配的内存块,但存在错误,请指出错误原因:`int*p=NULL;p=(int*)malloc(10*sizeof(int));free(p);free(p);`错误原因是________。三、读程序写结果题(每题6分,共12分)1.阅读以下C语言代码,写出程序输出的结果。```c#include<stdio.h>intmain(){intarr[3][2]={{1,2},{3,4},{5,6}};int(*p)[2]=arr;//p指向二维数组arr的首行int*q;q=(int*)p;//q指向二维数组arr的首个元素printf("p[0][1]=%d\n",p[0][1]);printf("*(p+2)[0]=%d\n",*(p+2)[0]);//等价于arr[2][0]printf("q[4]=%d\n",q[4]);//等价于arr[0][1]printf("*(*(p+1)+1)=%d\n",*(*(p+1)+1));//等价于arr[1][1]return0;}```2.阅读以下C语言代码,写出程序输出的结果。```c#include<stdio.h>structNode{intdata;structNode*next;};voidprintList(structNode*head){structNode*p=head;while(p!=NULL){printf("%d",p->data);p=p->next;}printf("\n");}intmain(){structNoden3,n2,n1;n1.data=1;n1.next=&n2;n2.data=2;n2.next=&n3;n3.data=3;n3.next=NULL;structNode*head=&n1;printList(head);structNode*p=head->next->next;p->data=99;//修改链表节点n3的数据printList(head);return0;}```四、改错题(每题6分,共12分)1.以下代码存在错误,请指出至少两处错误并改正。```c#include<stdio.h>intmain(){inta=10,b=20;int*p=&a;*p=100;p=&b;printf("a=%d,b=%d\n",a,b);printf("p=%d\n",*p);//错误1:应输出b的值,但打印的是p的地址intc;c=*p++;//错误2:c被赋值为20,p变为指向b的地址,但代码意图可能不是这样printf("c=%d,*p=%d\n",c,*p);return0;}```错误1:________;改正:________。错误2:________;改正:________。2.以下代码存在错误,请指出至少两处错误并改正。```c#include<stdio.h>#include<stdlib.h>intmain(){int*arr=(int*)malloc(5*sizeof(int));//正确:动态分配数组if(arr==NULL){printf("Memoryallocationfailed\n");return-1;}for(inti=0;i<5;i++){arr[i]=i*10;}//错误1:试图访问超出分配大小的内存printf("arr[10]=%d\n",arr[10]);free(arr);//错误2:重复释放内存free(arr);return0;}```错误1:________;改正:________。错误2:________;改正:________。五、编程题(每题10分,共20分)1.编写一个C语言函数`voidreverseArray(int*arr,intsize)`,该函数接收一个整型数组和它的大小作为参数,将数组中的元素顺序反转。调用示例:```cintarr[]={1,2,3,4,5};reverseArray(arr,5);//arr现在应为{5,4,3,2,1}```请在下方写出该函数的完整实现。2.编写一个C语言函数`structNode*insertFront(structNode*head,intvalue)`,该函数接收一个单向链表的头指针`head`和一个整型值`value`,创建一个包含`value`的新节点,并将其插入到链表的头部,返回新链表的头指针。假设链表节点定义如下:```cstructNode{intdata;structNode*next;};```请在下方写出该函数的完整实现。试卷答案一、选择题1.C2.B3.B4.B5.C6.A7.C8.B9.B10.C二、填空题1.15,地址p的值加1后的地址2.p<&arr[4]||p<=&arr[5](或p<arr+5)3.&str[0](或"Hello")4.swap(a,b)(或a^=b^=a^=b)5.names6.malloc,free7.空指针解引用8.NULL,head9.int*p=(int*)malloc(sizeof(int));(*p)=value;returnp;(示例实现,返回新分配的地址)10.重复释放内存,应只释放一次三、读程序写结果题1.输出:```p[0][1]=2*(p+2)[0]=5q[4]=2*(*(p+1)+1)=4```解析:*`p`是指向`int[2]`的指针,指向`arr[0]`。*`q`是指向`int`的指针,指向`arr[0][0]`。*`p[0][1]`就是`arr[0][1]`,值为2。*`*(p+2)[0]`等价于`arr[2][0]`,值为5。*`q[4]`等价于`*(q+4)`,即`arr[0][1]`,值为2。*`*(*(p+1)+1)`等价于`*(&arr[1][1])`,值为4。2.输出:```1231993```解析:*链表初始状态:n1(1)->n2(2)->n3(3)。*`printList(head);`输出链表所有元素:123。*`p=head->next->next;`指向节点n3,`p->data=99;`将n3的数据修改为99。*再次调用`printList(head);`输出修改后的链表:1993。四、改错题1.错误1:`printf("p=%d\n",*p);`;改正:`printf("p指向的值=%d\n",*p);`或`printf("b=%d\n",*p);`解析:`printf("p=%d\n",*p);`输出的是`*p`的值(即b的值20),而不是指针`p`本身的地址。如果意图是打印p指向的值,应使用`*p`。如果意图是打印变量b的值,应使用`b`或`*p`。错误2:`c=*p++;`;改正:`c=*p;`或`c=*p;p++;`解析:`p++`是先赋值后递增。`c=*p++;`等价于`c=*p;p=p+1;`。所以`c`被赋值为`*p`(即20),然后`p`变为指向`b`的地址。如果意图是让`c`赋值为`*p`后,`p`再指向下一个地址,应分开写或使用其他逻辑。2.错误1:`printf("arr[10]=%d\n",arr[10]);`;改正:`printf("arr[4]=%d\n",arr[4]);`解析:`malloc(5*sizeof(int))`分配了5个连续的整型单元,其有效索引范围是`arr[0]`到`arr[4]`。访问`arr[10]`越界了。错误2:`free(arr);`;改正:`//注释掉或删除此行`解析:`free`释放内存后,对应的指针应立即置为`NULL`以避免野指针,且同一块内存只能释放一次。代码中第二次调用`free(arr);`是错误的,可能是在第一次`free`之后指针`arr`未置为`NULL`导致的(虽然题目只要求指出两处),也可能仅仅是因为重复释放本身就是一个错误。按题目要求指出两处,重复释放是明确错误的。五、编程题1.函数实现:```cvoidreverseArray(int*arr,intsize){if(arr==NULL||size<=1)return;//空数组或单元素数组无需反转int*left=arr;//指向数组首部int*right=arr+size-1;//指向数组尾部while(lef
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 低品位铜矿烘干预处理对湿法冶金浸出率提升的边际效益量化模型
- 2026年火电电力职业技能鉴定考试-农电生产管理系统(输配电模块)历年参考题库含答案解析
- 2026年湛江幼儿师范专科学校高职单招笔试综合素质试题库含答案解析3套试卷
- 2026年湖南外国语职业学院高职单招笔试职业技能测验试题库含答案解析3套试卷
- 2026年湖北科技职业学院高职单招笔试英语试题库含答案解析3套试卷
- 2026年温州科技职业学院高职单招笔试英语试题库含答案解析3套试卷
- 2026年海南外国语职业学院高职单招笔试化学试题库含答案解析2套试卷
- 2026年浙江特殊教育职业学院高职单招笔试化学试题库含答案解析2套试卷
- 2026年浙江住院医师-浙江住院医师医学影像历年参考题库含答案解析
- 2026年法律知识法治建设知识竞赛-法治理论知识历年参考题库含答案解析
- 2026年分子病理检测技术规范培训考试试卷试题及答案
- 湖北省宜昌市枝江市2026年社区工作者招聘考试试卷-含答案解析
- 2026广西贺州市县级政府统计机构招聘统计协管员(协统员)32人备考题库附完整答案详解【历年真题】
- JJF(军工) 189-2018 超大规模集成电路老炼测试系统校准规范
- 2026年秋季开学大学秋季开学家长会课件
- 4.1《社会主要矛盾的变化》课件2026-2027学年统编版道德与法治九年级上册
- 2026年辅警招聘考试题库及完整答案(必刷)
- 2026 二年级开学第一课家长会家校携手护航新学期成长
- 2026年秋季第一学期心理健康咨询室学期推进工作计划
- 农村集体经营性建设用地入市方案模板
- 合规转利润:降本增效全指南(2026)《CBT 3472-2019船舶总体自由振动计算方法》
评论
0/150
提交评论