指针的反汇编


在一/二级指针的状态下,“指针是地址”概念是适用的。但在更高级别的状态下,这一概念就不再适用了

一、指针的基本性质

1

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

2

1、不带*类型的变量,++或者-- 都是假1 或者减1

2、带*类型的变量,可是进行++ 或者 --的操作

3、带类型的变量,++ 或者 – 新增(减少)的数量是去掉一个后变量的宽度

3

1、带*类型的变量可以加、减一个整数,但不能乘或者除.

2、带*类型变量与其他整数相加或者相减时:

带*类型变量 + N  =  带*类型变量 + N*(去掉一个*后类型的宽度)						
						
带*类型变量 - N  =  带*类型变量 - N*(去掉一个*后类型的宽度)						

3、两个类型相同的带*类型的变量可以进行减法操作.

4、想减的结果要除以去掉一个*的数据的宽度.

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

二、&与*

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;

在这里插入图片描述

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

在这里插入图片描述

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

在带 * 类型的变量前面加 * ,类型是其原来的类型减去一个*.

三、常量区问题

哪个可以修改?哪个不能改?

char* x = "china";			
char y[] = "china";			
void Function()			
{			
			
	*(x+1) = 'A';	//不能修改	
			
	y[1] = 'A';		//能修改
}			
			

void Function()			
{			
	char* x = "china";		
			
	char y[] = "china";		
			
	*(x+1) = 'A';		//不能修改
			
	y[1] = 'A';		//能修改
}		

关于数字

在这里插入图片描述

内存状况如下图所示
在这里插入图片描述

关于字符串
在这里插入图片描述

在这里插入图片描述


1int strlen (char* s)			
返回值是字符串s的长度。不包括结束符'/0'2char* strcpy (char* dest, char* src);			
复制字符串src到dest中。返回指针为dest的值。			
			
3char* strcat (char* dest, char* src);			
将字符串src添加到dest尾部。返回指针为dest的值。			
			
4int strcmp ( char* s1, char* s2);			
一样返回0  不一样返回1				
			
			
			
int strcmp(char* s1, char* s2)			
{			
	while(*s1 != '\0' && *s2 != '\0')		
	{		
		if(*s1 != *s2)	
		{	
			return 1;
		}	
		s1++;	
		s2++;	
	}		
	if(*s1 == '\0' && *s2 == '\0')		
	{		
		return 0;	
	}		
	else		
	{		
		return 1;	
	}		
}			
char* strcpy (char* dest,char* src)			
{			
	while((*(dest++)=*(src++))!=0);		
			
	return dest;		
}			
int strlen (char* s)			
{			
	int len = 0;		
	while(*(s) != 0)		
	{		
		len++;	
		s++;	
	}		
	return len;		
}			
char* strcat (char* dest, char* src)			
{			
	while(*dest != '\0')		
		dest++;	
	while((*dest++ = *src++)!='\0');		
			
	return dest;		
}			
			

四 结构体指针

在这里插入图片描述

在这里插入图片描述

五 数组指针

int *p[5] 与 int (*p)[5] 有什么区别?

原因:

[] 的优先级高于* 所以先组合成p[5]数组 再由int 说明 数组存储的类型 == int p[5];

() 的优先级高于[] 所以*先p先组合成指针 再由int[5]说明数组的宽度

在这里插入图片描述

在这里插入图片描述

注意 *(*p)等同于p[0][0]

六 函数指针

函数指针的声明:

返回类型(*函数名)(参数表) 		
		
如:int (*pFun)(int,int);		

函数指针不能进行 ++ – 等操作

隐藏代码到数据区:

其他步骤参见课堂:

找到硬编码

在这里插入图片描述

开始操作

unsigned char code[] = 		
{		
		0x55,
		0x8B, 0xEC,
		0x83, 0xEC, 0x40,
		0x53,
		0x56,
		0x57,
		0x8D, 0x7D, 0xC0,
		0xB9, 0x10, 0x00, 0x00, 0x00,
		0xB8, 0xCC, 0xCC, 0xCC, 0xCC,
		0xF3, 0xAB,
		0x8B, 0x45, 0x08,
		0x03, 0x45, 0x0C,
		0x5F,
		0x5E,
		0x5B,
		0x8B, 0xE5,
		0x5D,
		0xC3
};		
int main(int argc, char* argv[])		
{		
	typedef int (*Fun)(int,int);	
		
	Fun p = (int (*)(int,int))&code;	
		
	int x = p(2,2);	
		
	printf("%d\n",x);	
		
	return 0;	
}		

成功
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值