本篇文章将会以图片加文字的形式,分析在指针上常考的面试题,可以很好帮助我们进一步了解指针,早日拿到大厂offer。废话不服多说现在就开始吧!
----------------------------------------------------------------------------------------------------------------------------------------------
第一题:
首先,这道题目创建了一个数组里面有5个元素,随后是一个 ptr 的指针将 &a + 1 转化为int* 类型(对于数组,数组名是首元素的地址,但是当sizeof(a),&a 取的就是整个数组的地址,其他情况情况下都是首元素的地址)明白了这一点则代表此时的 ptr 指向了这个位置。
最后的打印为 *(a + 1) 代表 a 为首元素的地址 + 1代表向后走一位指向了 2。因此第一个答案为2;
*(ptr - 1) 注意此时的 ptr 是int* 类型 -1 就是先前移动1个整形 所以打印的是 5;
----------------------------------------------------------------------------------------------------------------------------------------------
第二道题:
struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
printf("%p\n", p + 0x1);
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
}
这道题是定义了一个结构体类型它的大小是 20 个字节,定义的是*p 代表这个结构体,那么里面 p存放的就是地址,接下来一个一个打印的分析
考察重点:指针的类型决定指针的运算!!!
(p + 0x1)是在 p 的地址上加 1 而结构体指针的大小为20个字节所以 + 1就是+ 20,0x又是16进制所以: 0x100014;
(unsigned long) p + 0x1 是先将 p(结构体指针)类型转化为整形,那么整形 + 1就是 + 1所以是0x100001;
(unsigned int*)p + 0x1 是将p(结构体指针)类型转化为整形指针,那么+ 1是跳过一个整形,也就是4个字节 所以: 0x100004;
--------------------------------------------------------------------------------------------------------------------------------
----------------------
第三道题:
我们创建了一个整形数组,里面有4个元素,(&a + 1)是整个数组的地址 + 1是跳过整个数组。初始化给了 ptr1(整形指针)。((int)a + 1)将数组类型转化为整形,a 是数组名代表首元素的地址,转化为整形时+1就是在地址上跳过一个字节(原因如图),所以最后根据数组存储为小端,又跳过一个字节的原理可知 ptr2 指向的位置
打印的 ptr1[-1] 表示先前移动一位,所以为 4
ptr2 表示数组里跳过一个字节的位置,为 int* 类型解引用时输出后4个字节的内容,又为小端存出高字节放在高地址处 最后打印为: 0x02000000(当然不会打印前面的0x0)
--------------------------------------------------------------------------------------------------------------------------------
----------------------------
第四道题 :
看了前面那么多题,乍一看还挺简单的但是里面的坑特别多。有没有注意到数组里面的时 (0, 1)不敏感的同学可能反应不过来,没错这就是逗号表达式。(是不是掉坑里了,以为是二维数组)能看出来这点这道题就好做了。数组是一个3行2列的数组,定义一个指针 p 指向了a[0] 逗号表达式显示最后一个,所以是1。
--------------------------------------------------------------------------------------------------------------------------------
--------------
第五道题:
先是定义了一个数组(int * [5]),有定义了一个数组指针(这个指针指向4个数字,类型为整形int * [4])。将数组首元素的地址转递给了p,虽然是将地址传递,但是里面是指向了4个数组。最后一个是打印%p地址,另外一个是打印%d整形。需要打印的表达式相同。那么&p[4][2]的指向如图所示,其次指针-指针(地址- 地址)都表示的是他们之间所差的个数,为-4 而 -4 放在内存里面是以补码的形式存在,打印地址不分正负直接打印补码、打印整形需要换为源码。最后结果为 -4的补码对应的16进制数字, 另外一个为 -4。
--------------------------------------------------------------------------------------------------------------------------------
第六题:
这里的 ptr1 跟前面的一样为一开始取整个数组的地址+ 1,跳到了最后面变成整形指针 -1代表先前移动一个整形,也就是一位答案为: 10 。
ptr2为aa 是二维数组首行的地址 +1代表指向了第二行,转化为int *类型,再- 1表示先前移动了一位,所以答案为:5;
--------------------------------------------------------------------------------------------------------------------------------
到此结束了我还会持续更新大厂的面试题,最后的最后,如果有什么疑问或者错误还请评论留言,我们共同进步!!如果对你有帮助还希望可以给我一个免费的赞。拜托了!😊😊😊