当前位置:网站首页>Dachang classic pointer written test questions
Dachang classic pointer written test questions
2022-07-07 20:19:00 【On the Pearl River】
This part is the classic pointer question , Practice hard , If you refuse, you will , As soon as I write fei
Catalog :
Pointer classic question
1. This topic is the epitome of classic pointer pen test questions
2. drawing 、 drawing 、 drawing
3. Classic questions :
Classic questions :
Pen test 1:

Particular attention :
①int* ptr = (int*)(&a + 1);
//&a It takes out the address of the entire array , therefore &a The type is int(*)[5], This type of +-1 What I'm skipping is 5 individual int type
// Cast , The type changes , And the value remains the same
②printf("%d,%d", *(a + 1), *(ptr - 1));
//*(ptr-1) Why just skip 1 individual int type , because ptr The type is int*, This type of +-1 skip 1 individual int type
if int* p=&a;* explain p It's a pointer variable ,int explain p The object is int type .p The type is int*
Answer to this question :2,5
The code is as follows :
#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;
}Pen test 2:

Particular attention :
there 0x1 It's hexadecimal , Convert to decimal to 1
It is known that p The value of is 0x100000,
①printf("%p\n", p + 0x1);
//p Is a structure type pointer variable ,p+-1 It means skipping a structure type size
if p Is an integer pointer variable ,p+-1 It means skipping an integer size
②printf("%p\n", (unsigned long)p + 0x1);
(unsigned long)p,p The type of changes but the value does not change ,
p The value of is 0x100000, convert to unsigned int Type followed by 1048576,+1 by 1048577, The address of this value is 0x100001
③printf("%p\n", (unsigned int*)p + 0x1);
// if p It's an integer pointer ,p+-1 Represents skipping an unsigned integer size
Answer to this question :
0x100014,0x100001,0x100004
The code is as follows :
#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;
}Pen test 3:

Particular attention :

①int* ptr2 = (int*)((int)a + 1);
//a Is the address of the first element of the array , Force type to int type , The value remains the same , The type changes
// if a=0x0012ff40, be a+1=0x0012ff44,(int)a+1=0x0012ff41
The storage of the array in memory ,vs Adopt small end storage mode ,0x00 00 00 01 Store in memory as 01 00 00 00
②printf("%x,%x", ptr1[-1], *ptr2);
//ptr2 The type is int*, Dereference operation access 1 Integer sizes , Then print in hexadecimal
Answer to this question :4,2000000
The code is as follows :
#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;
}Pen test 4:

Particular attention :
①int a[3][2] = { (0,1),(2,3),(4,5) };
// Here is the comma expression , Note that (), No { } , See the figure below to see the difference !
Answer to this question :1
The code is as follows :
#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;
}Pen test 5:

Particular attention :

①int a[5][5];
// In a two-dimensional array int a[5][5] in ,a Is the address of the first element of the array , The type is int (*)[5];
②int(*p)[4];
//p The array pointed to has 4 Elements , Each for int type ,+1 skip 1 individual (4 individual int An array of types )
③p = a;
int (*)[4]=int (*)[5];
printf("%p\n", &p[4][2] - &a[4][2]);
//&p[4][2] and &*(*(p+4)+2) equally .p Is an array pointer ,+4 skip 4 individual (4 individual int An array of types )//p++ It is the green icon in the above figure , Orange is p[4] Quoting
④&p[4][2] - &a[4][2]=-4;
//-4 Press %p Print , Yes, it will -4 The complement of is converted to hexadecimal
Original code :
10000000 00000000 00000000 00000100
Inverse code :
11111111 11111111 11111111 11111011
Complement code :
11111111 11111111 11111111 11111100
obtain 0xFF FF FF FC
Answer to this question :FF FF FF FC,-4
The code is as follows :
#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;
}Pen test 6:

Particular attention :
①int* ptr1 = (int*)(&aa + 1);
//&aa What you get is the address of the entire array ,+1 Skip the entire 2D array
②int* ptr2 = (int*)(*(aa + 1));
//aa Is the address of the first row of the two-dimensional array ,
*(aa + 1)=aa[1],aa[1] Is the address of the first element in the second line , This type is int*, So here's (int*) redundant
Answer to this question :10,5
The code is as follows :
#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;
}Pen test 7:

Particular attention :

①char* a[ ] = { "work","at","alibaba" };
// This array stores work、at、alibaba The address of the first element
②char** pa = a;
//pa Pointing to a The second element of the array , After dereferencing, we get at The address of the first element
③printf("%s\n", *pa);
//printf When printing ,%s According to the address of the first element , Print backwards , encounter \0 stop it
Answer to this question :at
The code is as follows :
#include <stdio.h>
int main()
{
char* a[] = { "work","at","alibaba" };
char** pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}Pen test 8:
This topic is the epitome of pointer pen test questions

Particular attention :

Code analysis :
++cpp after cpp The address pointed to will change
①printf("%s\n", **++cpp);
//++cpp after ,cpp Point to c+2, After the first dereference, we get c+2, and c+2 Pointing to the array c The third element , The array is obtained after the second dereference c The third element “POINT” The address of the first character ,printf When printing ,%s According to the first character P Print the address backwards , encounter \0 stop it
②printf("%s\n", *--*++cpp+3);
//++cpp after ,cpp Point to c+1, After the first dereference, we get c+1,c+1 Again -1 Pointing to the array c First element , The array is obtained after the second dereference c First element "ENTER" The address of the first character ,+3 obtain T The address of ,printf When printing ,%s According to the characters T Print the address backwards , encounter \0 stop it
③printf("%s\n", *cpp[-2]+3);
//**(cpp-2)+3;cpp-2 Point to c+3, After the first dereference, we get c+3, The address points to the array c Fourth element , The array is obtained after the second dereference c Fourth element "FIRST" The address of the first character ,+3 obtain R The address of ,printf When printing ,%s According to the characters R Print the address backwards , encounter \0 stop it
④printf("%s\n", cpp[-1][-1]+1);
//cpp[-1][-1]+1 and *(*(cpp-1)-1)+1;cpp-1 Point to c+2, After the first dereference, we get c+2, The address -1 Pointing to the array c The second element , The array is obtained after the second dereference c The second element "NEW" The address of the first character ,+1 obtain E The address of ,printf When printing ,%s According to the characters E Print the address backwards , encounter \0 stop it
Answer to this question :POINT,ER,ST,EW
The code is as follows :
#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;
}Conclusion :
If it helps you ,
Don't forget it give the thumbs-up + Focus on Oh , Crab
If it helps you ,
Don't forget it give the thumbs-up + Focus on Oh , Crab
If it helps you ,
Don't forget it give the thumbs-up + Focus on Oh , Crab
边栏推荐
- 一. 基础概念
- Open source heavy ware! Chapter 9 the open source project of ylarn causal learning of Yunji datacanvas company will be released soon!
- Graduation season | regretful and lucky graduation season
- Kubernetes -- detailed usage of kubectl command line tool
- Force buckle 1037 Effective boomerang
- 毕业季|遗憾而又幸运的毕业季
- EasyGBS级联时,上级平台重启导致推流失败、画面卡住该如何解决?
- 《数字图像处理原理与实践(MATLAB版)》一书之代码Part2[通俗易懂]
- Spark 判断DF为空
- When easygbs cascades, how to solve the streaming failure and screen jam caused by the restart of the superior platform?
猜你喜欢
随机推荐
Micro service remote debug, nocalhost + rainbow micro service development second bullet
Micro service remote debug, nocalhost + rainbow micro service development second bullet
Cloud 组件发展升级
How to implement safety practice in software development stage
Force buckle 1037 Effective boomerang
机械臂速成小指南(十一):坐标系的标准命名
Graduation season | regretful and lucky graduation season
九章云极DataCanvas公司摘获「第五届数字金融创新大赛」最高荣誉!
EasyGBS级联时,上级平台重启导致推流失败、画面卡住该如何解决?
毕业季|遗憾而又幸运的毕业季
使用camunda做工作流设计,驳回操作
ASP. Net learning & ASP's one word
图扑数字孪生煤矿开采系统,打造采煤“硬实力”
机械臂速成小指南(十二):逆运动学分析
I wrote a markdown command line gadget, hoping to improve the efficiency of sending documents by garden friends!
Kubernetes -- detailed usage of kubectl command line tool
How to cooperate among multiple threads
写了个 Markdown 命令行小工具,希望能提高园友们发文的效率!
ASP.NET学习& asp‘s one word
使用 BR 恢复 Azure Blob Storage 上的备份数据











