【c语言】指针(纠错)

单选题

1 下面能正确进行字符串赋值操作的是

A: char s[5={"ABCDE"};
B: char s[5={ ′A′, ′B′, ′C′, ′D′, ′E′};
C: char *s;s="ABCDE";
D: char *s;char a; scanf("%s",&s);

正确答案C;
选项A)和B)定义的数组空间太小,至少应该为6个字符的长度才可以。选项D)中的指针 s未赋初值,所以指向―个不确定的地址,因而不能用 scanf输入数据到这一指针所指向的地址中。

2 已定义以下函数:

 int  fun(int  *p){return  *p;}

fun函数返回值是 ( )
A: 一个整数
B: 形参p的地址值
C: 形参p中存放的值
D: 不确定的值
正确答案为C。

3 已定义以下函数

fun(char *p2, char *p1)
{  while((*p2=*p1)!='\0'{p1++;p2++;}
}

A: 将p1所指字符串复制到p2所指内存空间
B: 将p1所指字符串的地址赋给指针p2
C: 对p1和p2两个指针所指字符串进行比较
D: 检查p1和p2两个指针所指字符串中是否有’\0’

正确答案为A。
while((*p2=*p1)!='\0')有两个作用,一个是判断条件是否成立以决定是否再次进入循环,另一个作用是判定之前先完成*p2=*p1操作,该操作的作用是把p1所指存储单元的字符送给p2所指存储单元中。该循环作用就是把p1所指字符串中的字符逐一地送到p2所指存储单元,直到p1所指单元内容为’\0’为止。

4 设有程序段

int k=10;
while(k=0) k=k-1;

则下面描述中正确的是( )。
A: while循环执行10次
B: 循环是无限循环
C: 循环体语句一次也不执行
D: 循环体语句执行一次
正确答案为C
C语言中没有逻辑变量,用0来表示假,非0表示真.赋值后k=0,那么条件为假,则跳出循环,即一次也不执行

5 下列描述中不正确的是( )。
A: 字符型数组中可以存放字符串
B: 可以对字符型数组进行整体输入、输出
C: 可以对整型数组进行整体输入、输出
D: 不能在赋值语句中通过赋值运算符"="对字符型数组进行整体赋值
正确答案为C.
C语言规定只能逐个引用数组元素,而不能一次引用整个数组。对于字符数组,可以将整个字符串一次输入或输出。所以,选项C)不正确。

6 有以下定义:

char x[ ]="abcdefg";
char y[ ]={‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’};

则正确的叙述为( )。

A: 数组x和数组y等价
B: 数组x和数组y的长度相同
C: 数组x的长度大于数组y的长度
D: 数组x的长度小余数组y的长度

正确答案为C.
在C语言中,字符串以’\0’作为结束符,因此数组x的长度为7+1=8,而数组y的长度等于7.

7 下面四个选项中,均是不合法的用户标识符的选项是( )。

A: A P_0 do 
B:  float la0 _A
C: b-a goto int
D: _123 temp int

正确答案为C
C语言规定的标识符只能由字母、数字和下划线三种字符组成,第一个字符必须为字母或下划线,并且不能使用C语言中的关键字作为标识符。选项C)中goto和int是关键字,b-a中的"-"不是组成标识符的三种字符之一,所以,均是不合法用户标识符的选项是C)。

8
在这里插入图片描述
结构,可选用的赋值语句是( )。

A: *p1=*p2; 
B: p1=p2; 
C: p1=*p2; 
D: *p1=p2;

答案为B
题目要求是p1也指向b,也即p1同样有p1=&b的效果,则只需对指针p1赋值为p2即可。A的效果是:p1所指向的地址的内容变为p2所指向的地址内容,效果如同a=b;C的效果是将p1指向p2所指向的值所代表的地址,效果如同a=(int)(b);D的效果是将p1所指向地址内容改为p2,效果如同,a=&b

9 若有定义:int (*p)[4];则标识符p____________。
A: 是一个指向整型变量的指针
B: 是一个指针数组名
C: 是一个指针,它指向一个含有四个整型元素的一维数组
D: 定义不合法

正确答案为C
本题中相当于定义了一个二维数组int p[][4],标识符p是一个指针,指向一个含有4个元素的一维数组。

10 已有定义int k=2,*ptrl,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是( )

A: k=*ptr1+*ptr2 
B: ptr2=k
C: ptr1=ptr2 
D: k=*ptr1*(*ptr2)

正确答案为B.
ptr2 是指针 , k 是int型变量

11 语句int(*prt)();的含义是____________。

A: prt是一个指向一维数组的指针变量
B: prt是指向int型数据的指针变量
C: prt是指向函数的指针,该函数返回一个int型数据
D: prt是一个函数名,该函数的返回值是指向int型数据的指针

正确答案为C.

12 下面判断正确的是____________。

A: char *a="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) char * a;a="china"应改为chara;a=“china”;选项B) 应该将str[5]改为str[6];选项D) 表述方法错误,c,d两个数组定义时不能连续赋值。

13 若有语句int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则( )不是对a数组元素的正确引用(其中0≤i<10)。

A: p[i] 
B: *(*(a+i))
C: a[p-a]
D: *(&a[i])

正确答案为B.
a[p-a] p=a,p-a=0,这里就是引用 a[0]B. *(&a[i]) &a[i]表示取第i+1个元素的地址, *地址,表示引用地址中的数据,这里就是引用a[i]C. p[i] p是指针,地址,可以用数组元素引用方式来引用数组元素。p[i]就是a[i]D. *(*(a+i)) a+i是第i+1个元素的地址,*(a+i)是引用地址中的数据,是个整数,*整数,是错误的引用方式,会引起程序异常。

判断题

1:函数指针所指向的是程序代码区。
正确

如果指针未初始化,数据区或者空区、任意区
2:int *p;定义了一个指针变量p,其值是整型的。
错误

指针作为一种类型,在不同的系统中实现是不同的, 概念上就不是整形,只是在32位系统中指针是占2个字节(同int).
int *p;定义了一个指针变量p,其存储的值是一个地址,在这个地址存储的值是整型的

3语句*--p;执行之后p指向的内存单元被改变。
错误
前缀 – 优先级高于 *. 按规定,表达式中有前缀–时,要先执行减1再计算表达式的值。
所以 *--p 要分解为 2步。 求地址 p=p-1, 再取值 *p
p指向的内存单元 通常 在遇到分号后 改变。

填空

下面程序段是把从终端读入的一行字符作为字符串放在字符数组中,然后输出。请填空。

#include<stdio.h>
	main( )
	{
	 int i;
	 char s[80],*p;
	 for(i =0;i<79;i++)
	 {
	  s[i]=getchar( );
	  if(s[i]=='\n')
	   break;
	 }
	 s[i]=             ;
	 p=s;
	 while(*p)
	  putchar(*p++);
	}

答案为:s
由p=s.可知操作为赋值,故填
s.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值