8道大厂指针笔试题让你秒杀指针!!!

这篇博客收录了8道大厂的指针笔试题,这8道题涵盖的知识点比较全面,所以我认为有必要分享出来,相信只要理解这8道题,那其他的指针题都会迎刃而解。


废话不多说,直接上题:

第一题:


int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int *)(&a + 1);
    printf( "%d,%d", *(a + 1), *(ptr - 1));
    return 0;
}
读者可以先自己做一下,做出来后再来看解答哦;

解答

在这里插入图片描述
所以*(a+1)应该是a+1指向的元素,也就是2,*(ptr-1)应该是5。

结果
在这里插入图片描述

第二题:

struct Test
{
	int Num;
	char *pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;//定义了一个结构体指针 p

结构体的大小是20

int main()
{
    p=(struct Test *)0x00100000;//将16进制数字转换为结构体地址存放到p中
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}S

解答
在这里插入图片描述

结果在这里插入图片描述

第三题:

int main()
{
    int a[4] = { 1, 2, 3, 4 };
    int *ptr1 = (int *)(&a + 1);
    int *ptr2 = (int *)((int)a + 1);
    printf( "%x,%x", ptr1[-1], *ptr2);
    return 0;
}

想要做对这道题,就要求我们对数据在内存中的存储有一个比较好的掌握,起码得知道小端存储
在这里插入图片描述
上图展示的是数组a的四个元素在内存中的存储方式,注意这里的数字都是16进制,所以一个格子是一个字节。
先说*ptr1:
在这里插入图片描述
在以%x打印的时候,在内存中的读取是反向的,所以打印出来应该是
00000004**

ptr2:
在这里插入图片描述
以%x打印适合反向打印得02000000

结果:这里面4和2前面的0都省略了,因为它们没任何作用。
在这里插入图片描述

第四题:

#include <stdio.h>
int main()
{
    int a[2][3] = { (0, 1), (2, 3), (4, 5) };
    int *p;
    p = a[0];
    printf( "%d", p[0]);
 return 0;
}

解答:
在这里插入图片描述

结果:
在这里插入图片描述
第五题:

int main()
{
    int a[5][5];
    int(*p)[4];
    p = a;
    printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
    return 0;
}

解答:
黑色方框中为*(*(p+4)+2)
黑色方框中为*((p+4)+2).
在这里插入图片描述
结果:
在这里插入图片描述
这里我在将a赋值给p的时候用了强制类型转换,因为在2013上不转换的话跑不过去,因为a的类型是int(
)[5],p的类型是int (*)[4],有的编译器只会出现警告,不会报错。

第六题:

int main()
{
    int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int *ptr1 = (int *)(&aa + 1);
    int *ptr2 = (int *)(*(aa + 1));
    printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
    return 0;
}

解答:

在这里插入图片描述
结果:
在这里插入图片描述

第七题:

int main()
{
	char *a[] = { "work", "at", "tencent" };
	char **pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

解答:
不知道大家是否对字符指针有比较深的印象,温习一下吧
在这里插入图片描述
字符串赋给字符指针的时候只是将第一个字符的地址给了p;
在这里插入图片描述
结果:
在这里插入图片描述

第八题:

int main()
{
 char *c[] = {"ENTER","NEW","POINT","FIRST"};
 char**cp[] = {c+3,c+2,c+1,c};
 char***cpp = cp;
 printf("%s\n", **++cpp);
 printf("%s\n", *--*++cpp+3);
 printf("%s\n", *cpp[-2]+3);
 printf("%s\n", cpp[-1][-1]+1);
 return 0;
}

解答:
第一个
在这里插入图片描述
第二个
注意:第一次打印的时候++cpp,所以cpp是指向c+2的,不是指向c+3
在这里插入图片描述
第三个

在这里插入图片描述
第四个
cpp[-1][-1]可以化为*(*(cpp-1)-1),相信读者已具备能力解答。

结果:
在这里插入图片描述

不知道读者做完这8道题感觉如何,不管是好是坏,相信只要理解这8道笔试题,那指针就会很难出错了,当然刷题永无止境。

如有错误,还请读者指出,像大厂进发!!!

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值