C语言选择题

练习二级选择题,点击选项即可查看结果

第11题. int arr[5];,数组arr合法的最大下标是()
正确选项:
解析:C语言数组下标从0开始。int arr[5]拥有5个元素,下标分别为0、1、2、3、4。arr[5]属于越界访问,访问非法内存,产生未定义行为。
第12题. int arr[]={1,2,3,4};,数组元素个数为()
正确选项:
解析:定义一维数组省略数组长度时,编译器会根据初始化列表里面元素的总个数自动确定数组大小。初始化列表{1,2,3,4}一共4个元素,数组长度为4。
第13题. char s[]="hello";,数组s占用内存字节数为()
正确选项:
解析:C语言字符串常量末尾会自动追加'\0'作为字符串结束标记。hello有效字符5个,加上结束符'\0',sizeof(s)结果等于6。strlen只统计有效字符,得到5。sizeof计算占用内存大小,strlen计算字符串有效长度。
第14题. 获取字符串有效长度,应该使用库函数()
正确选项:
解析:strlen:获取字符串有效字符长度,不计入结束符'\0';strcpy实现字符串拷贝;strcmp实现字符串比较;strcat实现字符串拼接。以上函数都需要引入头文件#include <string.h>
第15题. char a[10],b[]="12345"; strcpy(a,b);执行完成后,a[3]的值是()
正确选项:
解析:字符串b各个下标:下标0字符'1',下标1字符'2',下标2字符'3',下标3字符'4',下标4字符'5',下标5存放'\0'。strcpy会把完整字符串连同结束符一起复制到数组a,所以a[3]的值是字符'4'。
第16题. int a=10; int *p=&a;,下面描述错误的是()
正确选项:
解析:p存储a的内存地址;*p是解引用操作,取出p指向地址存储的数据,等价变量a;&a是取a的内存地址。*p得到的是数值,&a得到的是地址,二者数据类型完全不同,不能等价。
第17题. int arr[3]={10,20,30}; int *p=arr; printf("%d",*(p+1));输出结果是()
正确选项:
解析:数组名arr代表数组首元素的地址,赋值给指针p。指针表达式p+1,会自动偏移一个int类型所占字节,指向数组第二个元素arr[1]。*(p+1)等价arr[1],数值为20。指针加减会根据指向的数据类型自动换算字节偏移量。
第18题. void fun(int x){ x=100; },调用 int a=10; fun(a);,调用结束后a的值是()
正确选项:
解析:C语言普通形参传递属于值传递。调用fun(a)时,会把变量a的值复制一份副本给形参x;函数内部修改的只是副本x,不会对外部实参a产生任何影响。如果想要在函数内部修改外部变量,需要传递变量地址使用指针。
第19题. int fun(int *p){ return *p; },调用 int a=20; printf("%d", fun(&a));输出结果()
正确选项:
解析:将变量a的内存地址传递给指针形参p。*p做解引用,读取地址对应存储的数据也就是a的值20,函数return把20返回,printf打印输出20。
第20题. 关于函数内部普通局部变量,叙述正确的是()
正确选项:
解析:普通局部变量作用域仅限定义它的大括号范围;不会自动初始化,初值为随机垃圾值;函数执行结束,栈内存释放销毁;不同函数里面的局部变量允许同名,互相独立互不干扰。