目录
- 例题一
- 题目解析
- 答案
- 例题二
- 题目解析
- 答案
- 例题三
- 题目解析
- 答案
- 例题四
- 题目解析
- 答案
- 例题五
- 题目解析
- 答案
- 例题六
- 题目解析
- 答案
- 例题七
- 题目解析
- 答案
感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐓🏀 python
例题一
以下系统中,int类型占几个字节,指针占几个字节,操作系统可以使用的最大内存空间是多大:( )
A.32位下:4,4,2^32 64位下:8,8,2^64
B.32位下:4,4,不限制 64位下:4,8,不限制
C.32位下:4,4,2^32 64位下:4,8,2^64
D.32位下:4,4,2^32 64位下:4,4,2^64
题目解析
32位系统下:
int占4个字节,指针表示地址空间个数,总共有2^32个,故占4个字节
64位系统下:
int占4个字节,指针表示地址空间个数,总共有2^64个,故占8个字节
注意指针是表示的是地址空间,而地址会因为系统不同而不同,比如32位的系统,一个地址就需要32个比特位来表示,而指针如果想要表示这个地址的话,同样也需要32个比特位才可以,所以在32为的系统条件下,指针占32个比特位也就是4个字节
答案
答案:C
例题二
下面代码的结果是:( )
#include <stdio.h>
int main()
{int arr[] = {1,2,3,4,5};short *p = (short*)arr;int i = 0;for(i=0; i<4; i++){*(p+i) = 0;}for(i=0; i<5; i++){printf("%d ", arr[i]);}return 0;
}
A.1 2 3 4 5
B.0 0 3 4 5
C.0 0 0 0 5
D.1 0 0 0 0
题目解析
注意数组arr一开始是整形类型的数组,而之后用short * p = (short*)arr将arr强制转换为short*,并且用short类型的指针p来接收
后面在通过*(p+1)来对数组的元素重新赋值,最后再打印
我们知道short类型的元素占2个字节,也就是16个比特位,而int类型的元素占4个字节,也就是32个比特位
因此下面是arr各元素的内存
01 00 00 00表示arr[0].02 00 00 00表示arr[1]…,
当我们for循环修改arr里面的元素时,过程如下
答案
答案 B
例题三
关于二级指针描述描述正确的是:( )
A.二级指针也是指针,只不过比一级指针更大
B.二级指针也是指针,是用来保存一级指针的地址
C.二级指针是用来存放数组的地址
D.二级指针的大小是4个字节
题目解析
A:二级指针是指针,不能说起比一级指针大,只能说二级指针指向的空间中存储的也是一个地址
C:数组的地址一般用一级指针存储,或者用数组指针接收
D:二级指针是指针,但是否占4个字节不一定,要看具体的系统,如果是32为的系统就是4个字节,但如果是64为的系统则是8个字节
答案
答案 B
例题四
下面关于指针运算说法正确的是:( )
A.整形指针(int*类型)+1,向后偏移一个字节
B.指针-指针得到是指针和指针之间的字节个数
C.整形指针解引用操作访问4个字节
D.指针不能比较大小
题目解析
A:整形指针+1,向后便宜一个整形类型的大小,即4个字节
B:两个指针相减,指针必须指向一段连续空间,减完之后的结构代表两个指针之间相差元素的个数
C:整形指向的是一个整形的空间,解引用操作访问4个字节
D:指针中存储的是地址,地址可以看成一个数据,因此是可以比较大小的
答案
答案 C
例题五
下面哪个是指针数组:( )
A. int* arr[10];
B.int * arr[];
C.int **arr;
D.int (*arr)[10];
题目解析
关于指针数组等相类似的如果有不懂的可以看我之前的一些文章
C语言深入理解指针(非常详细)(三)
C语言深入理解指针(非常详细)(四)
指针数组是一个数组,该数组的每个元素是一个指针
A:定义了一个数组,该数组中有10个元素,每个元素都是int*的指针类型
B:编译失败,定义数组时,要给出空间的大小,如果没有给时,必须要给出初始化结果
C:定义了一个二级指针(不用因为一个arr就认为是数组,数组在定义的时候需要 [ ] )
D:*和arr先结合,说明arr不是数组。实际上arr是一个指针,一个指向数组的指针(也就是数组指针)
答案
答案 A
例题六
下列程序段的输出结果为( )
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开始)
(即 * (pulPtr + 3)=pulPtr[3], * (pulPtr + 3)+3=pulPtr[3]+3),因为一开始puPtr[3]=pulArray[3]=9,所以最后结果就是将9改为9+3=12
printf(“%d,%d\n”,*pulPtr, *(pulPtr + 3)); // 打印第一个和第三个元素,因此:打印6和12
答案
答案 C
例题七
关于指针的概念,错误的是:( )
A.指针变量是用来存放地址的变量
B.指针变量中存的有效地址可以唯一指向内存中的一块区域
C.野指针也可以正常使用
D.局部指针变量不初始化就是野指针
题目解析
A:指针变量中存储的是一个地址,指向同类型的一块内存空间
B:地址是唯一的,一个指针变量中只能存储一个地址,因此可以唯一指向内存中的一块区域
C:野指针指向的空间时非法的,或者说该指针指向的空间已经不存在了,因此野指针不能使用
D:局部指针变量没有初始化时里面就是随机值,因此指向那个位置不一定,故将其看成是野指针
答案
答案 C