目录
- 前言
- 一、一维整型数组
- 1.1 题目一
- 1.2 题目二
- 二、二维整型数组
- 2.1 题目一
- 2.2 题目二
- 2.3 题目三
- 三、结构体
- 3.1 题目一(32位机器运行)
- 四、字符数组
- 4.1 题目一
- 4.2 题目二
- 总结
前言
本篇文章记录关于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'的地址
总结
本篇文章解析了指针在各种数组应用的练习题,解决这种题目,最好的方法就是画图。