以下C语言选择题选什么,并作简要分析。

1、以下能对一维数组 a 进行正确初始化的语句是_________ 。 A、int a[10]={0;0;0;0;0}; B、int a[10]={0} C、int a[ ] = {0} D、int a[10]={10*1} 2、若定义 int a[ ] ={1, 2, 3, 4, 5 , 6, 7 , 8 , 9 , 10}, *p=a ; 则值为 3 的表达式是 ( )。 A、p+=2,*(p++) B、p+=2,*++p C、p+=3,*p++ D、++*p 2、若有定义和语句 int **pp, *p, a=10, b=20; pp=&p; p=&a; p=&b; printf("%d,%d\n",*p,**pp); 则输出结果是( )。 A、10,20 B、10,10 C、20,10 D、20,20 3、设 int *p , I ;以下正确合理的语句是( )。 A、*p=10; B、i=p; C、i=*p; D、i=2*p+1; 4、设 char s[10] ; int I ; 以下引用数组 s 中元素正确的表达式是( )。 A、S(i+2); B、*(s+i) C、*(&s+i) D、*((s++)+i)

第1个回答  2019-06-22
1、以下能对一维数组
a
进行正确初始化的语句是_________

A、int
a[10]={0;0;0;0;0};
B、int
a[10]={0}
C、int
a[
]
=
{0}
D、int
a[10]={10*1}
答:
题打错了吧
应该是
不能正确初始化的是
是A
,BCD都可以初始化的
2、若定义
int
a[
]
={1,
2,
3,
4,
5
,
6,
7
,
8
,
9
,
10},
*p=a
;
则值为
3
的表达式是
(
)。
A、p+=2,*(p++)
B、p+=2,*++p
C、p+=3,*p++
D、++*p

:
A
,p+=2
指向的是3的位置
*(p++)的意思是
将p向后一个位置
指向的是4的位置
但是
返回值
返回的
依旧是三的位置
然后
用解引用操作符
返回值
应该就是3了
B
错了
是因为
没有括号
应为
++的优先级
和*是相同的
所以
是从右往左
运算的
先算++
后算*
所以
++p就把指针
指向了4的位置
在取值
得的就是4了
C和D
错的很明显
没什么好说的了
有问题再问我
2、若有定义和语句
int
**pp,
*p,
a=10,
b=20;
pp=&p;
p=&a;
p=&b;
printf("%d,%d\n",*p,**pp);
则输出结果是(
)。
A、10,20
B、10,10
C、20,10
D、20,20

D
**pp是指向指针的指针
它里面存储的是指针p的地址
p最后存储的是b的地址
所以
*p的值是20
*pp存储的是p的地址
所以**pp
解引用出来的
应该是
p地址的值
所以
还是应该20
3、设
int
*p

I
;以下正确合理的语句是(
)。
A、*p=10;
B、i=p;
C、i=*p;
D、i=2*p+1;

这个
编译正确的
应该是B
A
指针
不能把一个数据赋值给指针
因为指针
存储的是地址
数据
是没有地址的
所以
编译没有错误
但是
运行的时候
会出现内存错误导致程序的
崩溃
B
p是一个地址
地址
赋给int
是可以的
但是翻译出来的是一个随机数
编译可行
没错误
C
程序崩溃
因为
p没有被初始化
所以
p的地址
就是
CCCCCCCC
这时候编译器检查出错误了
程序
就停止运行了
D
2*p+1
*的优先级大于+的优先级
所以
程序
先解引用
之后
就导致程序错误了
因为
*有二义性
所以
其实哪个都不对
但是只有B能编译成功
4、设
char
s[10]
;
int
I
;
以下引用数组
s
中元素正确的表达式是(
)。
A、S(i+2);
B、*(s+i)
C、*(&s+i)
D、*((s++)+i)

int
i没有初始化
所以
你不知道
s
越没越界
正确的
表达式
应该是
B
他的含义
就是
s[i]
s
在这里面等于是这个字符串数组的
首地址
就是
s=&s[0]
A
明显错误
C
不能取地址的地址
地址
是唯一的
你取不出来
地址的
地址
编译器
会报错的
D
S++错了
s++的意思是取s的地址
让地址
让地址递增1在赋值给s
s首先就是一个地址
s是常量
他是不能被改变的
所以
出错误了
相似回答