C语言指针基础题(一)

目录

  • 例题一
    • 题目解析
    • 答案
  • 例题二
    • 题目解析
    • 答案
  • 例题三
    • 题目解析
    • 答案
  • 例题四
    • 题目解析
    • 答案
  • 例题五
    • 题目解析
    • 答案
  • 例题六
    • 题目解析
    • 答案
  • 例题七
    • 题目解析
    • 答案
  • 例题八
    • 题目解析
    • 答案

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
个人主页
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 
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]…,

C语言指针基础题(一)_第1张图片
当我们for循环修改arr里面的元素时,过程如下
C语言指针基础题(一)_第2张图片

C语言指针基础题(一)_第3张图片
C语言指针基础题(一)_第4张图片
C语言指针基础题(一)_第5张图片

答案

答案 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

例题八

在小端机器中,下面代码输出的结果是:( )

#include 
int main()
{
    int a = 0x11223344;
    char *pc = (char*)&a;
    *pc = 0;
    printf("%x\n", a);
    return 0;
}

A.00223344
B.0
C.11223300
D.112233

题目解析

答案解析:

假设,a变量的地址为0x64,则a变量在内存中的模型为:
0x64| 44 |
0x65| 33 |
0x66| 22 |
0x67| 11 |

char类型的指针变量pc指向只能指向字符类型的空间,如果是非char类型的空间,必须要将该空间的地址强转为char类型。
char pc = (char)&a; pc实际指向的是整形变量a的空间,即pc的内容为0x64,即44,
*pc=0,即将44位置中内容改为0,修改完成之后,a中内容为:0x11223300

答案

答案 C

你可能感兴趣的:(C语言例题,c语言,开发语言,学习方法,笔记,c++)