IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 大厂经典指针笔试题 -> 正文阅读

[C++知识库]大厂经典指针笔试题

本部分为指针经典题,努力练习,拒绝一看就会,一写就fei


🚀目录:

指针经典题

1.本题为经典指针笔试题的集大成者

2.画图、画图、画图

3.经典题:


🔥🔥🔥经典题:

🌵笔试题1:

?🔺特别注意:

int* ptr = (int*)(&a + 1);

//&a取出的是整个数组的地址,因此&a的类型是int(*)[5],该类型+-1跳过的是5个int型

//强制类型转换,类型发生变化,而值不变

printf("%d,%d", *(a + 1), *(ptr - 1));

//*(ptr-1)为什么只跳过1个int型,因为ptr的类型是int*,该类型+-1跳过1个int型

若int* p=&a;*说明p是指针变量,int说明p指向的对象是int类型。p的类型是int*

🔸本题答案:2,5

🔸代码如下:

#include <stdio.h>

int main()
{
	int a[5] = { 1,2,3,4,5 };

	int* ptr = (int*)(&a + 1);

	printf("%d,%d", *(a + 1), *(ptr - 1));

	return 0;
}

🌵笔试题2:

🔺特别注意:

这里的0x1是十六进制,转换成十进制为1

已知p的值是0x100000,

printf("%p\n", p + 0x1);

//p是一个结构体类型指针变量,p+-1代表着跳过一个结构体类型大小

若p是一个整型指针变量,p+-1代表着跳过一个整型大小

printf("%p\n", (unsigned long)p + 0x1);

(unsigned long)p,p的类型发生变化但值不变,

p的值是0x100000,转换成unsigned int类型后为1048576,+1为1048577,该值的地址就是0x100001

printf("%p\n", (unsigned int*)p + 0x1);
//若p是一个整型指针,p+-1代表着跳过一个无符号整型大小

🔸本题答案:

? ? 0x100014,0x100001,0x100004

🔸代码如下:

#include <stdio.h>

struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;

int main()
{
	printf("%p\n", p + 0x1);

	printf("%p\n", (unsigned long)p + 0x1);

	printf("%p\n", (unsigned int*)p + 0x1);

	return 0;
}

🌵笔试题3:

🔺特别注意:

int* ptr2 = (int*)((int)a + 1);

//a是数组首元素的地址,强制类型转换成int型,值不变,类型发生变化

//若a=0x0012ff40,则a+1=0x0012ff44,(int)a+1=0x0012ff41

该数组在内存中的存储,vs采用小端存储模式,0x00 00 00 01在内存中存储为01 00 00 00

printf("%x,%x", ptr1[-1], *ptr2);

//ptr2的类型是int*,解引用操作访问1个整型大小,再按十六进制打印

🔸本题答案:4,2000000

🔸代码如下:

#include <stdio.h>

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;
}

🌵笔试题4:

🔺?特别注意:

int a[3][2] = { (0,1),(2,3),(4,5) };

//这里是逗号表达式,注意是(),不是 { } ,看下图体会区别!

🔸本题答案:1

🔸代码如下:

#include <stdio.h>

int main()
{
	int a[3][2] = { (0,1),(2,3),(4,5) };

	int* p;

	p = a[0];

	printf("%d", p[0]);

	return 0;
}

🌵笔试题5:

🔺?特别注意:

int a[5][5];

//在二维数组int a[5][5]中,a为数组首元素的地址,类型为int (*)[5];

int(*p)[4];

//p指向的数组有4个元素,每个为int型,+1跳过1个(4个int类型的数组)

p = a;

? ?int (*)[4]=int (*)[5];

? ?printf("%p\n", &p[4][2] - &a[4][2]);
//&p[4][2]和&*(*(p+4)+2)一样。p是个数组指针,+4跳过4个(4个int类型的数组)

//p++为上图绿色图标,橙色为p[4]解引用

&p[4][2] - &a[4][2]=-4;

//-4按%p打印,是将-4的补码转换成十六进制

原码:

10000000 00000000 00000000 00000100

反码:

11111111 11111111 11111111 11111011

补码:

11111111 11111111 11111111 11111100

得到 0xFF FF FF FC

🔸本题答案:FF FF FF FC,-4

🔸代码如下:

#include <stdio.h>

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;
}

🌵笔试题6:

🔺特别注意:

int* ptr1 = (int*)(&aa + 1);

//&aa得到的是整个数组的地址,+1跳过整个二维数组

int* ptr2 = (int*)(*(aa + 1));

//aa为二维数组第一行的地址,

*(aa + 1)=aa[1],aa[1]为第二行首元素的地址,此类型为int*,因此这里的(int*)多余

🔸本题答案:10,5

🔸代码如下:

#include <stdio.h>

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;
}

🌵笔试题7:

🔺?特别注意:

char* a[ ] = { "work","at","alibaba" };

//该数组存的是work、at、alibaba首元素的地址

char** pa = a;

//pa指向的是a数组第二个元素,解引用后得到at首元素的地址

printf("%s\n", *pa);

//printf打印时,%s会根据首元素的地址,向后打印,遇到\0停止

🔸本题答案:at

🔸代码如下:

#include <stdio.h>

int main()
{
	char* a[] = { "work","at","alibaba" };

	char** pa = a;

	pa++;

	printf("%s\n", *pa);

	return 0;
}

🔥🔥🔥笔试题8:

本题为指针笔试题的集大成者

🔺特别注意:

代码剖析:

++cpp后cpp指向的地址会发生变化

printf("%s\n", **++cpp);

//++cpp后,cpp指向c+2,第一次解引用后得到c+2,而c+2指向数组c第三个元素,第二次解引用后得到数组c第三个元素“POINT”首字符的地址,printf打印时,%s根据首字符P的地址向后打印,遇到\0停止

printf("%s\n", *--*++cpp+3);

//++cpp后,cpp指向c+1,第一次解引用后得到c+1,c+1再-1指向数组c第一个元素,第二次解引用后得到数组c第一个元素"ENTER"首字符的地址,+3得到T的地址,printf打印时,%s根据字符T的地址向后打印,遇到\0停止

printf("%s\n", *cpp[-2]+3);

//**(cpp-2)+3;cpp-2指向c+3,第一次解引用后得到c+3,该地址指向数组c第四个元素,第二次解引用后得到数组c第四个元素"FIRST"首字符的地址,+3得到R的地址,printf打印时,%s根据字符R的地址向后打印,遇到\0停止

printf("%s\n", cpp[-1][-1]+1);

//cpp[-1][-1]+1和*(*(cpp-1)-1)+1;cpp-1指向c+2,第一次解引用后得到c+2,该地址-1指向数组c第二个元素,第二次解引用后得到数组c第二个元素"NEW"首字符的地址,+1得到E的地址,printf打印时,%s根据字符E的地址向后打印,遇到\0停止

🔸本题答案:POINT,ER,ST,EW

🔸代码如下:

#include <stdio.h>

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;
}

🚀结语:

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-05 23:22:06  更:2022-07-05 23:22:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/11 21:10:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码