练习-指针笔试题

本文详细解读了C语言中一维和二维整型数组、结构体以及字符数组的指针使用,涉及地址计算、数组初始化和内存理解,强调画图在解题中的重要性。
摘要由CSDN通过智能技术生成


前言

本篇文章记录关于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'的地址
		

在这里插入图片描述


总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值