1.下列程序段的输出结果为( )
unsigned long pulArray[] = {6,7,8,9,10}; unsigned long *pulPtr; pulPtr = pulArray; *(pulPtr + 3) += 3; printf("%d,%d\n",*pulPtr, *(pulPtr + 3));
A.9,12
B.6,9
C.6,12
D.6,10
unsigned long pulArray[] = {6,7,8,9,10}; unsigned long *pulPtr; pulPtr = pulArray; // 数组名代表数组首元素地址,因此pulptr指向的是数组中第一个元素的位置 *(pulPtr + 3) += 3; // pulptr+3访问的是数组中第三个元素(数组下标从0开始),故将9改为9+3=12 printf("%d,%d\n",*pulPtr, *(pulPtr + 3)); // 打印第一个和第三个元素,因此:打印6和12
因此:选择C
2.下面关于指针运算说法正确的是:( )
A.整形指针+1,向后偏移一个字节
B.指针-指针得到是指针和指针之间的字节个数
C.整形指针解引用操作访问4个字节
D.指针不能比较大小
答案解析:
注意:此题是有问题的,说法不严谨,如果将整形指针理解成int*类型的指针,那么一下说法解析如下
A:错误,整形指针+1,向后便宜一个整形类型的大小,即4个字节
B:错误,两个指针相减,指针必须指向一段连续空间,减完之后的结构代表两个指针之间相差元素的个数
C:正确,整形指向的是一个整形的空间,解引用操作访问4个字节
D:指针中存储的是地址,地址可以看成一个数据,因此是可以比较大小的
因此:选择C
3.以下关于指针的说法,正确的是( )
A.int *const p与int const *p等价
B.const int *p与int *const p等价
C.const int *p与int const *p等价
D.int *p[10]与int (*p)[10]等价
答案解析:
A:错误,int* const p中,const修饰指针变量p本身,表示p的指向不能改变,
int const *p中,const修饰p指针解引用之后的结果,表示p指向的内容不能改变
因此,不等价
B:错误,同上
C:正确,const都修饰p指针解引用之后的结果,表示p指向的内容不能改变
D:错误,int *p[10]定义了一个指针数组,数组中10个元素,每个元素都是int*类型的指针
int (*p)[10]定义了一个数组指针,该指针只能指向存储10个整形元素的数组
因此:选择C
4.C语言中哪一种形式声明了一个指向char类型变量的指针p,p的值不可修改,但p指向的变量值可修改?( )
A.const char *p
B.char const *p
C.char*const p
D.const char *const p
答案解析:
A:错误,const修饰*p,表示p指向的内容不能修改
B:错误,同上
C:正确,const修饰p本身,表示p的指向不能修改,p指向的空间中内容可以修改
D:错误,第一个const表示p指向的内容不能修改,第二个const表示p不能指向其他变量
因此,选择C
5.以下哪个操作可以避免野指针的出现?
A.使用空指针(NULL)初始化指针变量
B.在指针释放后将其设置为NULL
C.确保指针始终指向有效的内存地址
D.检查指针的有效性后再进行访问
全对
6..以下哪个描述最符合野指针的含义?
A.指向已被释放的内存空间的指针
B.指向堆栈中的局部变量的指针
C.指向全局变量的指针
D.指向动态分配的内存的
A
7.下面关于assert
宏的描述哪个是正确的?
A.assert宏总是会终止程序的执行
B.assert宏仅在调试模式下起作用
C.assert宏只能用于整数类型的表达式
D.assert宏可以通过编译选项进行启用或禁用
D
8.能把函数处理结果的2个数据返回给主调函数,在下面的方法中不正确的是:( )
A.return 这2个数
B.形参用数组
C.形参用2个指针
D.用2个全局变量
答案解析:
A:错误,一个函数只能返回一个结果
B:正确,将形参存在数组中,修改数组中内容,可以通过数组将修改结果带出去
C:正确,形参如果用指针,最终指向的是外部的实参,在函数中对指向指向内容进行修改,改变的就是外部的实参
D:正确,全局变量不受函数的结束而结束,在函数中改变全局变量,主调函数中可以看到改变之后的结果
因此,选择A