第一题
1、设有定义: char *p; ,以下选项中不能正确将字符串赋值给字符型指针 p 的语句是()
【多选】
A: p=getchar();
B: scanf("%s",p);
C: char s[]="china"; p=s;
D: *p="china";
答案与解析 A B D
A:错误,getchar是从缓冲区拿一个字符,赋值过去,无法赋值字符串,除非加循环;并且getchar的返回值为int,类型也不匹配;
B:错误,scanf会遇到空格停止,若赋值一个带有空格的字符串,则无法正确赋值;并且p没有分配内存,强行输入会导致野指针;
C:正确;
D:错误,类型错误
第二题
2、下述程序的输出是( )
#include<stdio.h>
int main()
{
static char *s[] = {"black", "white", "pink", "violet"};
char **ptr[] = {s+3, s+2, s+1, s};
char ***p;
p = ptr;
++p;
printf("%s", **p+1);
return 0;
}
A: ink
B: pink
C: white
D: hite
答案与解析 A
第三题
3、若有定义语句: char s[3][10];char (*k)[3];char* p; 则以下赋值语句错误的是( )
1.p = s;
2.p = k;
3.p = s[0];
4.k = s;
A: 124
B: 1234
C: 12
D: 234
答案与解析 A
在没有强制类型转换的情况下,只有类型完全相同的指针才能相互赋值
【p = s】错误:s是一个二维数组名,代表的是第一行的地址,是一个数组指针类型,而p只是一个char*类型,无法赋值;
【p = k】错误:同上;
【p = s[0]】正确:p类型为char*,s[0]表示第一行首元素的地址,类型为char*
【k = s】正确:都是数组指针类型,但s为char (*) [10] ,k为 char (*) [3],类型不同错误
第四题
4、假设 sizeof(void *) 为4, sizeof(char) 为1,那么对于 char str[sizeof("ab")]
sizeof(str) 的值是( )
A: 2
B: 3
C: 4
D: 代码无法编译
答案与解析 B
我们想知道sizeof(str)的值,因为str是数组名,sizeof(str)表示的是整个数组的大小,所以我们必须知道数组有几个元素;
char str[sizeof("ab")],求数组元素个数 -> 求sizeof("ab")
而 sizeof里面求的是类型,所以"ab"的类型为 const char [3];
这里是3的原因:"ab" 字符串末尾有个隐藏的 '\0';
所以sizeof("ab") = 3;
那char str[sizeof("ab")] = char str[3];
所以sizeof(str) = 3;
第五题
5、有如下程序段,则对函数 fun 的调用语句正确的是【多选】( )
char fun(char *);
int main()
{
char *s = "one";
char a[5] = {0};
char (*f1)(char *) = fun;
char ch;
return 0;
}
A: *f1(&a);
B: f1(*s);
C: f1(&ch);
D: ch = *f1(s);要改成(*f1)(s)才正确
答案与解析 CD
使用(*f1)(s)与f1(s)效果是相同的
首先明确f1为一个函数指针,相当于fun,那
A:*f1(&a):&a是取出整个数组的地址,类型为char (*) [5],与参数类型不匹配,错误
B:f1(*s) :*s类型为char类型,类型不匹配,错误;
C:f1(&ch):正确
D:因为()的优先级比*高,所以会返回char类型,但是char又被解引用,则错误