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

news2024/9/20 22:31:50

接着水。

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

  • 一、指针的宽度
    • 1.1 基础类型宽度
    • 1.2 一级指针宽度
    • 1.3 二级指针宽度
    • 1.4 四级指针宽度
    • 1.5 总结
  • 二、指针声明
  • 三、指针赋值
  • 四、指针的运算
    • 4.1 ++或--运算
    • 4.2 加减一个整数
    • 4.3 求差值
    • 4.4 比较
  • 五、作业
    • 1、char类型占几字节?char*类型占几字节?int*****占几字节?
    • 2、char** arr[10] 占多少个字节?
    • 3、自定义结构体如下(以下结果以x64环境为例):
      • 第一步:
      • 第二步:
      • 第三步:
      • 第四步:

一、指针的宽度

1.1 基础类型宽度

void Function()
{
	char x;
	short y;
	int z;
	 
	x = (char)1;
	y = (short)2;
	z = (int)3;
}
int main(int argc, char* argv[]){
	Function();
    return 0;
}

在这里插入图片描述

char类型1字节
short类型2字节
int类型4字节

1.2 一级指针宽度

void Function()
{
	char* x;
	short* y;
	int* z;
	 
	x = (char*)1;
	y = (short*)2;
	z = (int*)3;
}
int main(int argc, char* argv[]){
	Function();
    return 0;
}

在这里插入图片描述

一级指针全都为8字节长度(系统位长),即64位系统8字节长度,32位系统4字节长度

1.3 二级指针宽度

void Function()
{
	char** x;
	short** y;
	int** z;
	 
	x = (char**)1;
	y = (short**)2;
	z = (int**)3;
}
int main(int argc, char* argv[]){
	Function();
    return 0;
}

在这里插入图片描述

二级指针也为操作系统位宽

1.4 四级指针宽度

void Function()
{
	char**** x;
	short**** y;
	int**** z;
	 
	x = (char****)1;
	y = (short****)2;
	z = (int****)3;
}
int main(int argc, char* argv[]){
	Function();
    return 0;
}

在这里插入图片描述

四级指针也为操作系统位宽

1.5 总结

带*类型的变量赋值时只能使用“完整写法”
带*类型的变量宽度永远是8字节(x64)/ 4字节(x86)、无论类型是什么,无论有几个*

二、指针声明

指针声明的推荐方式与不推荐方式

推荐方式不推荐方式
char* x;char *x;
short* y;short *y
int* z;int *z
float* f;float *f
double* d;double *d
Student* st;Student *st

三、指针赋值

char* x;
short* y;
int* z;
 
x = (char*)1;
y = (short*)2;
z = (int*)3;	
/**************************************/
char** x;
short** y;
int** z;
 
x = (char**)1;
y = (short**)2;
z = (int**)3;	
/**************************************/
char***** x;
short***** y;
int***** z;
 
x = (char*****)1;
y = (short*****)2;
z = (int*****)3;	
/**************************************/
char********** x;
short********** y;
int********** z;
 
x = (char**********)1;
y = (short**********)2;
z = (int**********)3;

四、指针的运算

4.1 ++或–运算

char a ;
short b ;
int c ;
 
a = 100;
b = 100;
c = 100;
 
a++;
b++;
c++;
 
printf("%d %d %d",a,b,c);	//输出:101 101 101

/**********************************************************************************/

char* a ;
short* b ;
int* c ;
 
a = (char*)100;
b = (short*)100;
c = (int*)100;
 
a++;
b++;
c++;
 
printf("%d %d %d",a,b,c);	//输出:101 102 104


/**********************************************************************************/

char** a ;
short** b ;
int** c ;
 
a = (char**)100;
b = (short**)100;
c = (int**)100;
 
a++;
b++;
c++;
 
printf("%d %d %d",a,b,c);	//输出:108 108 108


/**********************************************************************************/

char*** a ;
short*** b ;
int*** c ;
 
a = (char***)100;
b = (short***)100;
c = (int***)100;
 
a++;
b++;
c++;
 
printf("%d %d %d",a,b,c);	//输出:108 108 108


/**********************************************************************************/

char**** a ;
short**** b ;
int**** c ;
 
a = (char****)100;
b = (short****)100;
c = (int****)100;
 
a++;
b++;
c++;
 
printf("%d %d %d",a,b,c);	//输出:108 108 108

总结:

  • 不带*类型的变量,++或者-- 都是加1 或者减1
  • 带*类型的变量,可以进行++ 或者 --的操作
  • 带*类型的变量,++ 或者 – 新增(减少)的数量是去掉一个后变量(带的变量依然是变量,宽度为寻址宽度,若不带*,则为原变量的宽度)的宽度

4.2 加减一个整数

测试环境为x64
char* a ;
short* b ;
int* c ;
 
a = (char*)100;
b = (short*)100;
c = (int*)100;
 
a = a + 5;
b = b + 5;
c = c + 5;
 
printf("%d %d %d",a,b,c);
//输出105 110 120	

/**********************************************************************************/

char** a ;
short** b ;
int** c ;
 
a = (char**)100;
b = (short**)100;
c = (int**)100;
 
a = a + 5;
b = b + 5;
c = c + 5;
 
printf("%d %d %d",a,b,c);
//输出140 140 140	

/**********************************************************************************/

char*** a ;
short*** b ;
int*** c ;
 
a = (char***)100;
b = (short***)100;
c = (int***)100;
 
a = a + 5;
b = b + 5;
c = c + 5;
 
printf("%d %d %d",a,b,c);
//输出140 140 140	

/**********************************************************************************/

char**** a ;
short**** b ;
int**** c ;
 
a = (char****)100;
b = (short****)100;
c = (int****)100;
 
a = a + 5;
b = b + 5;
c = c + 5;
 
printf("%d %d %d",a,b,c);
//输出140 140 140

/**********************************************************************************/

char* a ;
short* b ;
int* c ;
 
a = (char*)100;
b = (short*)100;
c = (int*)100;
 
a = a - 5;
b = b - 5;
c = c - 5;
 
printf("%d %d %d",a,b,c);
//输出95 90 80	

/**********************************************************************************/

char** a ;
short** b ;
int** c ;
 
a = (char**)100;
b = (short**)100;
c = (int**)100;
 
a = a - 5;
b = b - 5;
c = c - 5;
 
printf("%d %d %d",a,b,c);
//输出60 60 60	

/**********************************************************************************/

char*** a ;
short*** b ;
int*** c ;
 
a = (char***)100;
b = (short***)100;
c = (int***)100;
 
a = a - 5;
b = b - 5;
c = c - 5;
 
printf("%d %d %d",a,b,c);
//输出60 60 60	

/**********************************************************************************/

char**** a ;
short**** b ;
int**** c ;
 
a = (char****)100;
b = (short****)100;
c = (int****)100;
 
a = a - 5;
b = b - 5;
c = c - 5;
 
printf("%d %d %d",a,b,c);
//输出60 60 60

总结:

  • 带*类型的变量可以加、减一个整数,但不能乘或者除.
  • 带*类型变量与其他整数相加或者相减时:
    • 带*类型变量 + N = 带类型变量 + N(去掉一个*后类型的宽度)
    • 带*类型变量 - N = 带类型变量 - N(去掉一个*后类型的宽度)

4.3 求差值

char* a ;
char* b ;
 
a = (char*)200;
b = (char*)100;
 
int x = a - b;
 
printf("%d\n",x);
//输出100(100/1)	

short* a ;
short* b ;
 
a = (short*)200;
b = (short*)100;
 
int x = a - b;
 
printf("%d\n",x);
//输出50(100/2)	

int* a ;
int* b ;
 
a = (int*)200;
b = (int*)100;
 
int x = a - b;
 
printf("%d\n",x);
//输出25(100/4)	

char**** a ;
char**** b ;
 
a = (char****)200;
b = (char****)100;
 
int x = a - b;
 
printf("%d\n",x);
//输出12(100/8取整)

总结:

  • 两个类型相同的带*类型的变量可以进行减法操作,减法后是int型变量
  • 相减的结果要除以去掉一个*的数据的宽度

4.4 比较

char**** a;
char**** b;
a = (char****)200;
b = (char****)100;
if(a>b)
{
	printf("1");
}
else        
{
	printf("2");
}
//输出1

总结:

  • 带*的变量,如果类型相同,可以做大小的比较。

五、作业

1、char类型占几字节?char*类型占几字节?int*****占几字节?

答:char类型占1个字节,int*****占4(x86)/8(x64)字节。

2、char** arr[10] 占多少个字节?

答:arr[10]占40(x86)/80(x64)字节。

3、自定义结构体如下(以下结果以x64环境为例):

struct Student
{
	int x;
	int y;
};

第一步:

Student**** s;
 
s = (Student****)100;

s++; //s的值是多少?
答:s的值是100,s++的值是100+8=108。
s = s+2; //s的值是多少?
答:s+2的值是100+28=116。
s = s-3; //s的值是多少?
答:s-3的值是100-3
8=76。

第二步:

Student**** s1;
Student**** s2;
int x;
 
s1 = (Student****)200;        
 
s2 = (Student****)100;        

x = s1-s2; //x的值是多少?
答:s1-s2的值是(200-100)/8=12。

第三步:

Student* s;
 
s = (Student*)100;

s++; //s的值是多少?
答:s++的值是100+8=108。
s = s+2; //s的值是多少?
答:s+2的值是100+28=116。
s = s-3; //s的值是多少?
答:s-3的值是100-3
8=76。

第四步:

Student* s1;
Student* s2;
int x;
 
s1 = (Student*)200;
 
s2 = (Student*)100;

x = s1-s2; //x的值是多少?
答:x的值是(200-100)/8=12。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【总结】技术总监说nginx配置https都不会,立即、马上开掉!

原文:https://mp.weixin.qq.com/s/7mAH6XyME8ixy8l5-ACpvg 工作中经常会遇到需要手动安装部署nginx,为了安全起见,上线后都需要开启https,本文将从安装部署,一步一步操作,最终实现nginx编译安装&#xff0…

ai写作生成器免费哪个好?这4个ai写作生成器嘎嘎好使

秋雨绵绵,云南的山水间仿佛被施了魔法,每一滴雨珠都像是大自然赋予的buff,让这片土地的美景更加动人。在这诗意盎然的季节里,如果写作也能像这秋雨一样,自然而富有魔力,那该有多好~ 幸运的是,现…

idea怎么从commit信息中打开对应文件

点击Commit 右击想要打开的文件,点击Jump to Source

Veeco电源维修RF600 RF全系列射频电源维修

美国维易科VEECO RF600是为实验室设计的600W可编程直流电源, 研究开发和生产环境,功率要求从10 mW到600 W不等。无论负载或线路条件如何,它都能提供高度准确和稳定的直流输出功率, 使其非常适合各种高功率实验和生产测试应用。 RF600具有广泛的输出电压和电流值选择,以及一系列…

vuejs 源代码启动 调试

vuejs源代码启动 调试 1.项目启动 下载pnpm npm install pnpm -g安装依赖 pnpm install启动 npm run dev启动后会生成packages\vue\dist\vue.global.js,这个文件为实时更新的源码打包文件,我们调试源码需要引入这个文件 2.创建study/myVue.vue文件&…

Improved Baselines with Visual Instruction Tuning

总结 1. 改进:LLAVA-1.5 基于LLAVA架构,提出了LLAVA-1.5,通过简单的修改(如使用MLP投影和增加学术任务相关数据)建立了更强的基线。在11个基准测试中,LLAVA-1.5实现了最先进的性能,尽管仅使用…

openGuass——管理用户安全

一、默认权限机制 二、管理员 1、核心管理员 2、辅助管理员 三、三权分立 1、思想 2、实践 四、权限操作 1、用户的创建与删除 2、用户的修改与信息查看 五、角色 1、创建、修改和删除角色 六、GRANT 七、REVOKE 八、设置用户安全策略 自动锁定和解锁用户 手动锁…

输入与输出(12)

在 C 语言中,标准输入输出库(stdio.h)是用来处理输入和输出操作的主要工具。这个库提供了一系列功能强大的函数来读写各种数据类型,这对任何C程序都是至关重要的。下面是对 C 中输入和输出功能的更详细解释。 1.stdio.h 库 通过包…

9:00面试,9:05就出来了,问的问题有点出乎意料!

从小厂跳槽出来,本以为能在新公司大展拳脚,没想到没多久就再次遭遇困境。 入职初期,加班成了家常便饭,尽管如此,考虑到薪酬还算可观,我并没有过多抱怨。然而,到了六月,一纸通知打破…

第十二章、 集合

第十二章、 集合 12.1 集合的理解和好处 数组 (1). 长度开始时必须指定,而且一旦指定,不能修改 (2). 保存的必须为同一类型的元素 (3). 使用数组进行增加/删除元素的示意代码—比较…

力扣刷题(复习版)

文章目录 题目:最大重复子字符串题解 题目: 面试题 16.07. 最大数值题解 题目: 最大字符串配对数目题解 题目: 字符串中第二大的数字题解 总结 题目:最大重复子字符串 原题链接:最大重复子字符串 题解 …

JetBrains RubyMine 2024.2 (macOS, Linux, Windows) - 最智能的 Ruby 与 Rails IDE

JetBrains RubyMine 2024.2 (macOS, Linux, Windows) - 最智能的 Ruby 与 Rails IDE JetBrains 跨平台开发者工具 请访问原文链接:https://sysin.org/blog/jetbrains-rubymine/,查看最新版。原创作品,转载请保留出处。 作者主页&#xff1…

等保测评中的安全测试方法

等保测评,即信息安全等级保护测评,是我国网络安全领域的重要评估机制,用于验证网络系统或应用是否满足相应的安全保护等级要求。在等保测评中,安全测试方法扮演着至关重要的角色。本文将详细介绍等保测评中常用的安全测试方法及其…

自定义@Resource注解功能

文章目录 1.目录2.Resource.java3.MonsterController.java 依赖注入Service调用方法4.SunWebApplicationContext.java1.executeResource方法完成依赖注入,先按照名字再按照类型2.init方法调用 5.测试 1.目录 2.Resource.java package com.sunxiansheng.springmvc.a…

Linux网络配置和系统管理

Linux网络配置和系统管理 1.查看网络IP和网关windows系统主机 IP虚拟机 IP虚拟机网关网络检测命令 ping网络连接模式 2.配置静态IP地址(NAT网络连接模式)前提说明配置主机的VMware Network Adapter VMnet8 网卡静态IP地址注意点虚拟机配置静态ip修改后ping命令测试修改虚拟机静…

选择泛域名证书还是多域名证书?

在选择泛域名SSL证书(也称为通配符SSL证书)和多域名证书时,需要综合考虑多个因素,包括业务需求、成本效益、灵活性以及未来规划等。以下是对这两种证书的比较及选择建议: 一、定义与特点 泛域名SSL证书(通…

智能巡检系统,确保到位管理,提升安全效率新境界

在现代工业生产与设施管理中,巡检作为确保设备安全、预防故障发生的重要环节,其效率与准确性直接关系到企业的运营安全与经济效益。然而,传统的人工巡检方式往往存在巡检周期长、覆盖面有限、数据记录易出错、隐患难以及时发现等痛点&#xf…

大模型分布式训练进阶之路:数据并行、管道并行、张量并行、3D并行

系统化的学习大模型,除了知道大模型是什么,也得知道大模型是如何训练的,对大模型的实际应用有更加定量的认知,该文章也算是一篇分布式训练的学习过程总结,作为循序渐进学习分布式训练的总结。 类似之前写过的LLM文章&…

U盘怎么加密保护?U盘加密软件哪个好?

在工作和生活中,我们经常需要使用U盘来存储数据。而为了避免U盘数据泄露,我们需要加密保护U盘。那么,U盘加密软件哪个好呢?下面我们就一起来了解一下。 BitLocker加密 BitLocker是Windows系统提供的磁盘加密功能,可以…

DevOps实现CI/CD实战(三)- 集成Sonar Qube

七、集成Sonar Qube 1. SonarQube介绍 Sonar Qube是一个开源的代码分析平台,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。 Sonar Qube可以与多种软件整合进行代码扫描&#…