C语言 第六章 指针 重点 典型题
一、概念
二、重点代码
三、重点题目
1、若有说明:int *p,m=5,n;,以下程序段正确的是( )
A. p=&n;
scanf("%d",&p);
B. p=&n;
scanf("%d",*p);
C. scanf("%d",&n);
*p=n;
D. p=&n;
*p=m;
答案:D
解析:
2、已有变量定义和函数调用语句:int a=25;print_value(&a);,以下函数的输出结果是( )
void print_value(int *x)
{ printf("%d\n",++*x); }
A. 23 B. 24 C. 25 D. 26
答案:D
解析:
3、下面判断正确的是( )
A. char *p="china"; 等价于char *a; *a="china";
B. char str[10]={"china"}; 等价于char str[10]; str={"china"};
C. char *s="china"; 等价于char *s; s="china";
D. char c[4]="abc",d[4]="abc"; 等价于char c[4]=d[4]="abc";
答案:C
解析:选项A中定义一个指针变量a,使a指向字符串china的起始地址,而在赋值语句中的*a表示a所指向位置的值,因此*a="china"是错误的。
选项B定义了有10个元素的数组str,并存储字符串china,但str[]={"china"}; 是错误的赋值。
选项C中定义了指针变量s的同时并指向字符串china的起始地址,相当于先定义指针变量,然后再使指针变量指向字符串china的起始地址,因此该选项是正确的。
选项D中char c[4]=d[4]="abc"; 的定义是错误的。
4、下面能正确进行字符串操作的是( )
A. char s[5]={"ABCDE"};
B. char s[5]={'A','B','C','D','E'};
C. char *s; s="ABCDE";
D. char *s; scanf("%s",s);
答案:C
解析:选项A定义的数组长度不够,因后面字符串需要6个字节。
选项B中数组s存放的不是字符串,因字符串必须用'\0'表示结束。
选项C中定义了指针变量s的同时并指向字符串ABCDE的起始地址,是正确的操作。
选项D中指针变量s没有具体指向,不能使用。
5、以下程序的运行结果是( )
char *s="abcde";
s+=2;printf("%s",s);
A. cde B. 字符c C. 字符c的地址 D. 不确定
答案:A127
解析:指针变量s指向字符串abcde的起始位置(即字符a的位置),s+=2后s指向字符c所在的位置,执行printf("%s",s);就是从s指向的位置开始输出,直到遇到第一个结束符,因此应输出字符串cde。
6、设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下能正确执行的赋值语句是( )。
A. c=*p1+*p2 B. p2=c C. p1=p2 D. c=*p1*(*p2)
答案:C
解析:因指针变量p1和p2都指向同一字符串,*p1和*p2的值是某个字符,由于字符串的ASCII码值为0~127,因此*p1+*p2或*p1*(*p2)的值可能超过127,这样得到的字符串变量c的值可能没有意义,因此选项A和D不能保证正确。
选项B中是将字符串变量c的值赋给指针变量p2,类型不正确。
选项C将两个同级的有指向的指针赋值,是正确的。
7、设有程序段:char s[]="china";char *p;p=s;,则下列叙述正确的是( )
A. s和p完全相同
B. 数组s中的内容和指针变量p中的内容相等
C. s数组长度和p所指向的字符串长度相等
D. *p与s[0]相等
答案:D
解析:char s[]="china"表示定义了长度为6的字符数组s,s[0]的值是字符c,“china *p;p=s;”定义了一个指针变量p且p指向数组s的起始位置。选项A中s是数组,其占用内存的大小为6个字节,p是指针变量,存储变量的地址,占用4个字节的内存。
选项B中s的内容是字符串china,而p中的内同是字符串china的起始地址。
选项C中数组s的长度是6,指针p所指向的字符串的长度是5(注:字符串长度不包括结束符)。
选项D中*p的值是字符c,s[0]的值也是字符c,因此选项D正确。
8、若已定义char s[10];,则在以下表达式中不表示s[1]的地址的是( )。
A. s+1 B. ++s C. &s[0]+1 D. &s[1]
答案:B
解析:C语言中,数组名是一个地址常量,表示该数组的起始地址。数组元素s[1]的地址可表示为&s[1]、s+1、&s[0]+1,而s++是错误的运算表达式(因s是常量,不能进行自增自减运算)。
9、若有定义int (*p)[4];,则标识符p( )
A. 是一个指向整型变量的指针
B. 是一个指针数组名
C. 是一个指针,它指向一个含有4个整型元素的一维数组
D. 定义不合法
答案:C
解析:在C语言中,语句int (*p)[4]; 表示定义了一个行指针(指向一个有4个整型元素的一维数组的指针),因此选项C正确。
10、若要对a进行自增运算,则a应说明为( )。
A. int a[3][2]; B. char *a[]={"12","ab"};
C. char (*a)[3] D. int b[10],*a=b;
答案:D
解析:要对指针进行自增运算,a必须为指针变量,且要指向连续的存储区域(自增运算才有意义)。选项A中a为数组名,是地址常量。选项B中定义了一个指针数组,a为指针数组的数组名,也就是地址常量。选项C中定义了一个行指针变量a,但没有指向连续存储区域。选项D中先定义了有10个元素的数组b,指针变量a指向数组b的起始位置,因此自增运算才有意义。
11、已有函数max(a,b),为了让函数指针变量p指向指针变量p指向函数max,正确的赋值方法是( )
A. p=max B. p=max(a,b)
C. *p=max D. *p=max(a,b)
答案:A
解析:函数指针定义形式为“数据类型 (*变量名)()”,表示函数的入口地址。要使该指针指向函数的入口位置,必须将函数名赋给函数指针变量,所以A正确。
12、以下叙述正确的是( )
A. C语言允许main函数带行参,且形参个数和形参名均可由用户指定
B. C语言允许main函数带形参,形参名只能是argc和argv
C. 当main函数带有形参时,传给形参的值只能从命令行中得到
D. 若有说明int main(int argc,char **argv);,则argc的值必须大于1
答案:C
解析:C语言中main函数的参数是从命令行中自动获取的,当没有参数时,表示程序文件本身,因此参数的个数至少为1 。
选项A中参数不应该由用户指定,是自动从命令行获取的。
选项B中参数名不一定是argc和argv,只要对应的类型正确就可以。
选项D中argc的值必须大于1的结论是不正确的,当只有程序文件名时,argc的值为1 。
13、在C程序中,指针变量能够赋予常量 值或变量地址值。
解析:C语言中的指针变量可以赋值常量(其中0表示空指针,数组名表示该指针指向数组的起始位置)。也可以将一个同类型的变量地址赋给指针变量,表示该指针存储或指向该变量的起始存储位置。
14、在C语言中,数组名是一个不可改变的指针(或地址常量),不能对它进行赋值运算。
解析:C语言中的数组名是一个地址常量,表示该数组存在内存中的起始位置。
15、若有定义语句int a[2][3]={2,4,6,8,10,12};,则*(&a[0][0]+2*2+1)的值是12 ,*(a[1]+2)的值是12。
解析:C语言中的二维数组是按行优先存储的。(&a[0][0]+2*2+1)就是从a[0][0]的存储位置向移动5个存储位置,正好是a[1][2]的位置,因此*(&a[0][0]+2*2+1)就是a[1][2]。*(a[1]+2)展开可表示为*(*(a+1)+2),正好也是a[1][2]。
16、若有程序段
int *p[3],a[6],i;
for(i=0;i<3;i++)
p[i]=&a[2*i];
则*p[0]引用的是a数组元素a[0],*(p[1]+1)引用的是数组a数组元素a[3]。
解析:p是指针数组(即定义了3个指针p[0]、p[1]、p[2]),p[0]=&a[0],p[1]=&a[2],p[2]=&a[4],因此*p[0]就是a[0],*(p[1]+1)就是*(&a[2]+1)(由于数组是连续存储的),也就是a[3]。
17、以下程序的运行结果是6。
#include <stdio.h>
int fun(char *)
int main()
{
char *a="abcdef";
printf("%d\n",fun(a));
return 0;
}
int fun(char *s)
{
char *p=s;
while (*p)
p++;
return (p-s);
}
解析:函数fun是将指向字符串最后的指针p与指向起始位置的指针s相减,其本质是求字符串s的长度。主函数中字符指针a指向的字符串的长度为6 。
18、当运行以下程序时,输入6(回车)的程序运行结果是976531。
#include<stdio.h>
void fun(char * ,char);
int main()
{
char s[]="97531",c;
c=getchar();
fun(s,c);
puts(s);
return 0;
}
void fun(char *a,char b)
{
while (*(a++)!='\0');
while (*(a-1)<b)
*(a--)=*(a-1);
*(a--)=b;
}
解析:函数fun的第一个while循环是将指针a移到字符串结束符的位置。第二个while循环是Vonda字符串的最后一个字符开始和字符变量b进行比较:若小于b,则将字符串的字符保存到后一个位置,指针向字符串前面移动一个位置:若大于或等于b,则循环结束,然后将b中存储的字符插入到该位置。主函数中字符串为97531,c='6',因此输出结果为976531 。
19、当运行以下程序时,输入“9,5(回车)”的程序运行结果是5,9。
#include<stdio.h>
void swap(int *p1,int *p2);
int main()
{
int a,b;
int *pa,*pb;
scanf("%d,%d",&a,&b);
pa=&a;
pb=&b;
swap(pa,pb);
printf("\n%d,%d",&a,&b);
return 0;
}
void swap(int *p1,int *p2)
{
int p;
p=*p1;
*p1=*p2;
*p2=p;
}
20、以下程序的功能是将数组a中的元素值首尾交换并存储在数组中。
#include<stdio.h>
void inv(int *,int);
int main()
{
int i,a[10]={3,7,9,11,0,6,7,5,4,2};
inv(a,10);
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
}
void inv(int *x,int n)
{
int t,*p,*i,*j,m=(n-1)/2;
i=x;
j=x+n-1;
p=x+m;
for(;i<=p;i++,j--)
{
t=*i;
*i=*j;
*j=t;
}
}
解析:函数inv中,指针变量i指向数组的起始位置,指针变量j指向数组最后一个元素,p指向数组的中间位置,指针变量i和j分别向后移动和向前移动,并同时将所指向元素的值进行交换,直到i移到中间位置。
21、以下函数的功能是将一个整数字符串转换为一个整数,例如将"1234"转换为1234,请填空使程序完整。
int chnum(char *p)
{
int num=0,k,len,j;
len=strlen(p);
for(;*p!='\0';p++)
{
k=*p-'0';
j=(--len);
while( j--)
k=k*10;
num=num+k;
}
return (num);
}
解析:函数chnum中将指针p指向的字符串从第一个字符开始,利用*p-'0'将数字字符转换为数字,直到字符串结束,因此第一空填*p!='\0'或*p。变量k表示对应数字字符转换为的数字,则第二空应填*p-'0'。由于是高位数字先转换,则要将转换后的数字k不断乘以10,根据不同的数位确定乘以10的数目,j表示当前的数位第三空应填j--。
22、以下函数的功能是统计子串substr在母串str中出现的次数,请填空使程序完整。
int count(char *str,char *substr)
{
int num,i,j,k;
for(i=0;str[i]!=0; i++)
for(j=i,k=0; substr[k]==str[j]; k++,j++)
if(substr[k+1]=='\0')
{
num++;
break;
}
return (num);
}
答案:i<strlen(str)(或str[i]或str[i]!=0),j=i,k+1 。
解析:
23、以下函数的功能是用递归法将一个整数按逆序存放到一个字符数组中,例如483存放成了"384",请填空使程序完整。
void convert(char *a,int n)
{
int i;
if((i=n/10)!=0)
convert(a+1,i);
*a=(char)(n%10)+'0';
}
答案: a+1 , (char)(n%10)+'0' (或(n%10)+'0')
解析:要将数值转换为相应的字符串,采用数位分离(除以10取余,再整除10),再将每位数字和字符0相加得到相应的数字字符。第一空是递归调用convert函数,将整除10后所得的商作为函数参数,同时指针向后移动一个存储单元,因此应填a+1 。第二空是将每位数字和字符0相加,转为数字字符,应填(char)(n%10)+'0'。
24、以下函数的功能是用递归法求数组中的最大值及其下标,请填空使程序完整。
void findmax(int *a,int n,int i,int *pk)
{
if(i<n)
*pk=i;
findmax( a, n , ++i , pk );
}
解析:函数findmax的参数中,a表示指向数组的指针变量,pk是存放最大值下标的地址,n是数组元素的个数,i是下表控制变量。若a[i]>a[*pk],则下标改变为i,因此第一空填*pk=i。然后递归调用,比较下一个元素,第二空填“a,n,++i,pk”。
25、以下函数的功能是将两个字符串s1和s2连接起来,请填空使程序完整。
void conj(char *s1,char *s2)
{
char *p=s1;
while (*s1)
s1++ ;
while (*s2)
{
*s1= *s2 ;
s1++,s2++;
}
*s1='\0';
s1=p ;
}
解析:将指针变量s2指向的字符串连接到s1所指向的字符串后面,首先要将指针s1移到字符串最后,然后将s2所指字符串的字符赋值给s1所指的位置,同时指针变量s1、s2向后移动,因此第一空填s1++,第二空填*s。由于s1已经指到连接后的字符串的最后,要将指针移到前面,则第三空填s1=p。
26、假定输入的字符串中只包含字母和*。请编写函数fun,它的功能是:除了字符串前导的*之外,将串中其他的*全部删除。在编写函数时,不得不去使用C语言提供的字符串函数。例如,若字符串中的内容为****A*BC*DEF*G******,删除*后,字符串中的内容则应当是****ABCDEFG。
法一:普通写法
void fun(char x[])
{
int i,j=0;
for(i=0;i<strlen(x)&&x[i]=='*';i++)
{
x[j++]=x[i];
}
while(x[i])
{
if(x[i]!='x')
x[j++]=x[i];
i++;
}
x[j]='\0';
}
法二:指针
void fun(char *x)
{
int i,j=0;
char *p;
p=x;
while(*p=='*')
*x++=*p++;
while(*p)
{
if(*p!='*')
*x++=*p;
p++;
}
*x='\0';
}
解析:从左到右扫描,找到第一个不是*的字符(找到相应的下表位置,例如j),将后面所有不是*的字符都保存到数组中,直到结束,然后写入数组结束符'\0'。
(未完待续)
C语言 第六章 指针 重点 典型题相关推荐
- 沈阳师范大学大一上册C语言PTA题目集以及答案(第六章 指针 函数题篇)
沈阳师范大学大一上册C语言PTA题目集以及答案(第六章 指针 函数题篇) 6-1 字符串的连接 (15分) 本题要求实现一个函数,将两个字符串连接起来. 函数接口定义: char *str_cat( ...
- 沈阳师范大学大一上册C语言PTA题目集以及答案(第六章 指针 编程题篇)
沈阳师范大学大一上册C语言PTA题目集以及答案(第六章 指针 编程题篇) 7-1 输出学生成绩 (20分) 本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩.最高成绩和最低成绩.建议使用 ...
- 006-高级语言程序设计C 第六章,高级语言程序设计_C语言(第六章 数组.ppt
<高级语言程序设计_C语言(第六章 数组.ppt>由会员分享,可在线阅读,更多相关<高级语言程序设计_C语言(第六章 数组.ppt(30页珍藏版)>请在人人文库网上搜索. 1. ...
- c语言指针与一维数组PPT,C语言第5章指针和一维数组.ppt
C语言第5章指针和一维数组.ppt 2019/11/5,第5章 指针与一维数组,软件学院计算机科学与技术教研室 冯海文 fhw19770704,2019/11/5,5.1 指针的概念与运算,C语言继承 ...
- c语言第六章数组题库及详解答案,C语言第六章数组习题答案.doc
C语言第六章数组习题答案 第六章 数组 习题答案 一.选择题 12345678910CDBDCDDBCC11121314151617181920DBBCDDCDBD212223242526272829 ...
- c语言单字符输入和输出函数分别为,c语言第六章字符数据
<c语言第六章字符数据>由会员分享,可在线阅读,更多相关<c语言第六章字符数据(18页珍藏版)>请在人人文库网上搜索. 1.第6章字符数据,6.1字符常数,6.2字符变量,6. ...
- 04737 c++ 自学考试2019版 第六章课后练习 程序设计题 1
/* * 04737 c++ 自学考试2019版 第六章课后练习 * 程序设计题 1 * 需求:将第五章习题中设计的交通工具...... */#include<iostream> #inc ...
- 第六章第十五题(金融应用:打印税表)(Financial application: print a tax table)
第六章第十五题(金融应用:打印税表)(Financial application: print a tax table) *6.15(金融应用:打印税表)程序清单3-5给出了计算税款的程序.使用税款的 ...
- 【维生素C语言】第六章 - 指针
前言: 本章是指针部分的开始,将对C语言中非常重要的指针进行讲解.本章结束后有能力的读者可对应指针进阶部分进行进一步学习.指针专题配备了一些笔试题,建议尝试. [维生素C语言]第十章 - 指针的进阶( ...
最新文章
- LeetCode 191 Number of 1 Bits
- centos7安装mysql5.6.25
- python显示1000以内的斐波拉契数列_python实现斐波那契数列
- c语言 两个文件相似度比较,某课程设计---文件相似度判断
- mongodb lbs java_LBS JAVA Spring mongoDB
- Hadoop+GPU强强联手的性能探索
- 算法6:只有五行的Floyd最短路算法
- python写入中文到文件乱码的问题
- linux手动安装rsync_Linux中安装使用rsync | 学步园
- 《QML 基础教程》
- git log根据特定条件查询日志并统计修改的代码行数
- 基于单片机智能药盒控制系统设计(含论文)
- DotSpatial入门
- 【论文阅读】强化学习-Transfer and Multitask RL专题8篇
- 计算摄影 | 摄像机成像原理及参数解析
- BootCDN——React入门学习
- 人脸识别(Facenet)
- 项目管理修炼之道之把握项目的节奏
- windows修改默认端口3389
- 【硬核扫盲】到底什么是相干光通信?