栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

指针应用——八大笔试题详解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

指针应用——八大笔试题详解

目录

前言

正文

第一题

第二题

第三题

第四题

第五题

第六题

第七题

第八题

总结

鸣谢


前言

  我们在前面学习了指针初阶、进阶的知识,作为C语言中的重难点,指针有很大的几率出现在面试时的笔试题中,本文所讲解的八道笔试题皆由比特科技整理,希望大家能通过我对这八道题的详细讲解对指针能有一个更深层次的认识。

  注意:文中图片上的代码所引用的头文件#include位于代码最顶部,因截图不方便,所以没有显示出来,如果读者想尝试其中的代码,记得加上#include!!!

正文

话不多说,直接开始!

第一题

第一题主要考察了数组名和&数组名的区别

//指针笔试八题
//题一
int main()
{
	int a[5] = { 1,2,3,4,5 };
	int* ptr = (int*)(&a + 1);
	printf("%d %dn", *(a + 1), *(ptr - 1));
	return 0;
}

第二题

第二题中加入了结构体,本质上还是在进行指针间的运算

//题二
// 已知结构体Test的大小是20字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}* p=0x100000;
//假设p的值为0x100000,以下表达式的值分别是多少?
int main()
{
	//指针类型决定指针的运算
	//0x1表示1
	printf("%dn", p );
	printf("%dn", p + 0x1);//结构体类型-Test,+20
	printf("%dn", (unsigned long)p + 0x1);//unsigned long类型,+1
	printf("%dn", (unsigned int*)p + 0x1);//unsigned int*类型,+4
	return 0;
}

第三题

第三题考察了数据在内存中的存储,同时考察了ptr1 [-1]与 *(ptr1-1) 的转换

//题三
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);
	//%x 以十六进制打印
	return 0;
}

第四题

第四题属于细节题,细心点就能做对

//题四
int main()
{
	int a[3][2] = { (0,1),(2,3),(4,5) };
	//逗号表达式,其实为a[3][2]={1,3,5}
	int* p;
	p = a[0];
	printf("%d", p[0]);
	return 0;
}

第五题

第五题考察了数组指针的容量问题

//题五
int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	//4装5,产生偏移
	printf("%p %dn", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
	//指针-指针=元素个数,低地址-高地址,得到负数,即-4
	return 0;
}

第六题

第六题还算简单,就是有的地方具有迷惑性

//题六
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,%dn", *(ptr1 - 1), *(ptr2 - 1));
	//10,5
	return 0;
}

第七题

第七题是出自阿里巴巴的笔试题,可以看看

//题七
int main()
{
	char* a[] = { "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%sn", *pa);
	return 0;
}

第八题

第八题作为本文的压轴大戏,难度可谓是碾压前面,下面让我们来欣赏这个小东西

 

 

 

 

 

 

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

 第八题终于结束了

总结

  指针应用的八题已经全部讲解完毕,总的来说本文介绍指针的各种考法,如数组名与&数组名的区别、指针在内存中的状态、指针间的运算、多级指针嵌套寻址等知识,希望大家在看完我的文章后能对指针这个小东西有更好的理解,作者因水平有限,只能做出较为劣质的见解,希望大家能理性吸收,如文章中有不足的地方,希望大家多多指出,共同分享更好的知识!

鸣谢

  感谢比特鹏哥所传授的知识@比特鹏哥

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1008501.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号