练习-指针笔试题


前言

本篇文章记录关于C语言指针笔试题的介绍。


一、一维整型数组

1.1 题目一

在这里插入图片描述
题目分析

arr是首元素地址,即&arr[0]
&arr取的是整个数组的地址,类型为int(*)[5],&arr+1跳过整个数组的大小

在这里插入图片描述


1.2 题目二

在这里插入图片描述

题目分析

%x 按16进制格式输出
&arr取出的是整个数组的地址,&arr+1为跳过整个数组的地址
ptr1指向数组最后一个元素的末尾
ptr1[-1] -> *(ptr1+(-1)) ->*(ptr1-1),ptr1[-1] = 00000004
arr表示首元素地址,即&arr[0], (int)arr+1将地址强制转换为整型,进行加法运算
ptr2指向的是数组第一个元素的第二个字节,*ptr2操作四个字节,*ptr2 = 20000000

下图以32位机器为例,将1,2, 3, 4分别按16进制在内存中的存储位置如下
整数1的十六进制 00 00 00 01 高位->低位
整数2的十六进制 00 00 00 02
整数3的十六进制 00 00 00 03
整数4的十六进制 00 00 00 04
在这里插入图片描述


二、二维整型数组

2.1 题目一

在这里插入图片描述
题目分析

数组初始化时,利用了逗号表达式,逗号表达式的结果为最后一个表达式的结果,相当于以下的初始化方式
int arr[3][2] = { {1,3}, {5,0}, {0,0}};
arr[0]表示第一行的数组名,数组名表示首元素地址,相当于&arr[0][0]
则p[0] -> *(p+0) -> *( p) -> *(&arr[0][0]) -> arr[0][0] = 1


2.2 题目二

在这里插入图片描述
题目分析

指针变量p是一个数组指针,指向4个整型元素的数组
p[4][2] - >*( *(p+4) + 2)
两个相同类型指针相减的绝对值为相差的元素个数
&p[4][2]和&arr[4][2]的位置如下如所示
&p[4][2]和&arr[4][2]相差4个元素,则 &p[4][2] - & arr[4][2] = -4
-4的原反补如下
原码:1000 0000 0000 0000 0000 0000 0000 0100
反码:1111 1111 1111 1111 1111 1111 1111 1011
补码:1111 1111 1111 1111 1111 1111 1111 1100
%d输出的是原码 -4
%p输出的是地址,十六进制 ff ff ff ff ff ff ff fc

在这里插入图片描述


2.3 题目三

在这里插入图片描述
题目分析

&arr,取整个二维数组的地址,&arr+1跳过一个二维数组大小
*(arr+1),arr数组名,为首元素地址,第一行的地址,arr+1为第二行的地址
*(arr+1) -> arr[1],第二行的数组名,第二行第一个元素的地址

在这里插入图片描述


三、结构体

3.1 题目一(32位机器运行)

在这里插入图片描述
题目分析

将一个十六进制数0x100000强制转换为结构体指针变量的值,则p = 0x00100000
p+0x01,结构体指针变量p向前走一步,结构体占20个字节,则跳过20个字节,20的十六进制为00000014
00100000 + 00000010 = 00100014
(unsigned long)p+0x01,(unsigned long)p将p强制转换为一个无符号长整型,则进行整型的加法运算
00100000 + 00000001 = 00100001
(unsigned int*)p+0x01,(unsigned int*)p将p强制转换为一个整型指针变量,向前走一步跳过4个字节
00100000 + 00000004 = 00100004


四、字符数组

4.1 题目一

在这里插入图片描述
题目分析

ps为二级指针变量
str为数组名,表示首元素地址,即char*的地址
ps++, ps = ps+1,跳过一个char*的大小

在这里插入图片描述


4.2 题目二

在这里插入图片描述
题目分析

		表达式一: **++pps,
		++pps, pps = pps+1; pps指向ps[1]
		**(pps) == str[2]; 得到字符串"POINT"首元素地址
		
		表达式二: * -- * ++pps + 3, 这时的pps指向ps[1]
		++pps, pps = pps+1; pps指向ps[2]
		*(pps) == ps[2]; 得到指向str[1]的地址
		--*(pps),得到指向str[0]的地址
		*--*(pps),得到字符串"ENTER"的首元素地址
		*--*(pps)+3,跳过3个字符的大小,得到字符串"ENTER"中字符'E'的地址
		
		表达式三: *pps[-2]+3,这时的pps指向ps[2]
		pps[-2] == *(pps-2),这里的pps不会改变,但表达式(pps-2)指向的是ps[0]*(pps-2) == ps[0]
		*pps[-2] == *ps[0],得到指向"FIRST"的首元素地址,即字符F的地址
		*pps[-2] +3, 向前走三步,得到"FIRST"字符'S'的地址
		
		表达式四: pps[-1][-1]+1,这时pps指向ps[2]
		pps[-1][-1] == *(*(pps-1)-1);
		*(pps-1),得到ps[1],即得到指向str[2]的地址
		*(pps-1-1,得到指向str[1]的地址
		*(*(pps-1-1),得到字符串"NEW"首元素地址,即字符'N的地址'
		*(*(pps-1)-1)+1,跳过一个字符,得到字符串"NEW"中字符'E'的地址
		

在这里插入图片描述


总结

本篇文章解析了指针在各种数组应用的练习题,解决这种题目,最好的方法就是画图。

相关推荐

  1. C语言:指针试题

    2024-01-10 02:40:02       6 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-10 02:40:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-10 02:40:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-10 02:40:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-10 02:40:02       18 阅读

热门阅读

  1. 第二百五十五回

    2024-01-10 02:40:02       36 阅读
  2. 联合union

    2024-01-10 02:40:02       36 阅读
  3. Unity3D 如何实现多玩家语音聊天详解

    2024-01-10 02:40:02       42 阅读
  4. linux 使用多版本 go goenv.sh

    2024-01-10 02:40:02       39 阅读
  5. Python程序中的异常处理解决方法

    2024-01-10 02:40:02       35 阅读
  6. TDengine的笔记

    2024-01-10 02:40:02       33 阅读