当前位置: 首页 > news >正文

滴水逆向三期笔记与作业——02C语言——12 指针(2)

滴水逆向三期笔记与作业——02C语言——12 指针2

  • 一、类型转换
  • 二、&符号的使用
  • 三、指针求值
  • 四、指针操作数组
  • 五、作业
    • 1、列出每一行的反汇编代码:
    • 2、列出每一行的反汇编代码:
    • 3、完成代码,实现数组值的互换

OneNote防丢。

一、类型转换

略,无需总结,多用即熟悉。

二、&符号的使用

&是地址符,类型是其后面的类型加一个“*”,任何变量都可以使用&来获取地址,但不能用在常量上。

char a = 10;
short b = 20;
int c = 30;char* pa = &a;
short* pb = &b;
int* pc = &c;        
//&pa 是char*类型
//&pb 是short*类型
//&pc 是int*类型
char a = 10;
short b = 20;
int c = 30;char* pa = (char*)&a;
short* pb = (short*)&b;
int* pc = (int*)&c;/*简写为:*/
char* pa = &a;
short* pb = &b;
int* pc = &c;
char a = 10;
short b = 20;
int c = 30;char* pa = &a;
short* pb = &b;
int* pc = &c;char** ppa = (char**)&pa;
short** ppb = (short**)&pb;
int** ppc = (int**)&pc;/*简写为:*/
char** ppa = &pa;
short** ppb = &pb;
int** ppc = &pc;

三、指针求值

int* px;
int** px2;
int*** px3;
int**** px4;//*(px) 是int类型
//*(px2) 是int*类型
//*(px3) 是int**类型
//*(px4) 是int***类型
  • 观察反汇编
int x,y;
int* px;
int** px2;
int*** px3;x = 10;
px = &x;
px2 = &px;
px3 = &px2;
y = *(*(*(px3)));

在这里插入图片描述

  • 解析:

x:rbp-0x8
y:rbp-0x4
px:rbp-0x10,存放了8字节的rbp-0x8地址
px2:rbp-0x18,存放了8字节的rbp-0x10地址
px3:rbp-0x20,存放了8字节的rbp-0x18地址
最后在给y赋值时,通过地址寻址找到10的路径是:[rbp-0x20]—>[rbp-0x18]—>[rbp-0x10]—>[rbp-0x8]

  • 总结:
    类型的变量,可以通过在其变量前加来获取其指向内存中存储的值
    在带类型的变量前面加,类型是其原来的类型减去一个*

四、指针操作数组

char arr[10];
char* p = &arr[0]; //取数组第一个元素的地址
char* p2 = arr;    //简写
char* p = arr;
for(int k=0;k<10;k++)
{
printf("%d\n",*(p+k));
}short* p = arr;
for(int k=0;k<10;k++)
{
printf("%d\n",*(p+k));
}int* p = arr;
for(int k=0;k<10;k++)
{
printf("%d\n",*(p+k));
}

五、作业

1、列出每一行的反汇编代码:

char a = 10;
short b = 20;
int c = 30;
char* pa = &a;
short* pb = &b;
int* pc = &c;char** ppa = &pa;
short** ppb = &pb;
int** ppc = &pc;

在这里插入图片描述

2、列出每一行的反汇编代码:

int p = 10;
int******* p7;
int****** p6;
int***** p5;
int**** p4;
int*** p3;
int** p2;
int* p1;p1 = &p;
p2 = &p1;
p3 = &p2;
p4 = &p3;
p5 = &p4;
p6 = &p5;
p7 = &p6;

在这里插入图片描述

3、完成代码,实现数组值的互换

void Function()
{int arr[5] = {1,2,3,4,5};//..此处添加代码,使用指针,将数组的值倒置//打印数组值的代码已经写完,不需要修改for(int k=0;k<5;k++){printf("%d\n",*(p+k));}
}
void Function()
{int arr[5] = {1,2,3,4,5};int* p = arr;int temp;int* q = &arr[4];//..此处添加代码,使用指针,将数组的值倒置//将p++和q--写到for判断体中,*q = temp这句代码会报指针分段错误,crazy,没弄明白。for (int i = 0; i <= 5/2; i++){temp = *p;*p = *q;*q = temp;p++;q--;}p = arr;//打印数组值的代码已经写完,不需要修改for(int k=0;k<5;k++){printf("%d\n",*(p+k));}
}int main(int argc, char* argv[]){Function();return 0;
}//不用中间指针的方式
void Function()
{int arr[5] = {1,2,3,4,5};int* p = arr,temp;// ..此处添加代码,使用指针,将数组的值倒置for (int i = 0; i<5/2; i++){temp = *(arr + i);*(arr + i) = *(arr + 4 - i);*(arr + 4 - i) = temp;}//打印数组值的代码已经写完,不需要修改for(int k=0;k<5;k++){printf("%d\n",*(p+k));}
}int main(int argc, char* argv[]){Function();return 0;
}

http://www.mrgr.cn/news/53152.html

相关文章:

  • 儿童鞋垫特殊哥
  • Google play开发者账号被封,申诉就有机会,别不信
  • 这家一汽集团供应商终止,分红超净利润一半,业绩有下滑趋势
  • 软件产品国际化:前后端及App多语言版本解决方案(超详细实现过程)
  • IEEE捡漏期刊!IF不高,但贵为中科院2区TOP刊,潜力巨大!
  • 布隆过滤器 不适用的场景
  • 双十一性价比高的宠物空气净化器推荐,希喂、米家、霍尼韦尔测评
  • 开发指南074-自适应屏幕
  • echarts大屏常用图表-饼图
  • 精华帖分享 | 从华泰研报出发,开启人工智能炼丹篇章!
  • Oracle T5-2 本地磁盘做硬件RAID 1
  • c++的哈希表、哈希桶的介绍与实现
  • 一种系留气球快速放气装置
  • 骨传导耳机哪个牌子最好?买前必看五大骨传导耳机测评分享
  • TapData 知识库 | 一文吃透数据整合(Data Consolidation)
  • 5555字的程序员脱单攻略,看了后悔一天,不看后悔一辈子!
  • 【计网笔记】数据链路层
  • python爬取themoviedb电影网站信息
  • obj模型转成gltf/glb格式
  • 书籍推荐 --- 历代经济变革得失