re学习记录从入门到入狱【12】

指针类型

1. 指针类型

int* a;
float* b;
char* c;

加上*之后,就变成了一个新的类型,统称为“指针”
2. 如何赋值

a = (int*)5;
short = (short*)1;
char = (char*)1;

定义指针有多少个*,就给括号里写多少个,要对应起来。
可以给两个相同的指针变量赋值

int** a;
int** b;
a = (int**)6;
b = a;

3. 指针变量宽度
指针对于C语言,相当于一个新的类型。

#include <stdio.h>
#include <windows.h>
void main()
{
	char* a;
	short* b;
	int* c;
	a = (char*)1;
	b = (short*)2;
	c = (int*)4;
	system("pause");
	return;
}

在这里插入图片描述
我们发现char,short,都成为了dword,4字节
不会,指针类型永远是4字节,不管是什么类型,不管是有多少*号
4. 指针的自加自减运算
普通的基本类型
int a;
a++;
这种代码我们已经能明白了
他就是每次自己+1,或者-1
那么指针类型呢?

#include <stdio.h>
#include <windows.h>
void main()
{
	char** a;
	short** b;
	int** c;
	a = (char**)5;
	b = (short**)5;
	c = (int**)5;
	a++;
	b++;
	c++;
	printf("%d %d %d \n", a, b, c);
	system("pause");
	return;
}

我们发现如下图所示,都变成了9
在这里插入图片描述
但是如果我们只有一个星星呢?
在这里插入图片描述
我们发现只有一个星的时候,都是加了自身的类型宽度
char是1字节,5+1=6
short是2字节,5+2=7
int是4字节,5+4=9
所以我们得出以下结论

++--时,会加或减,当前"*"星数去掉一个后类型的宽度(比如我们上面的例子,一个*,去掉了就是普通的char,int,short,对应着1字节,4字节,2字节)

非指针的类型,也就是不带*的数据类型,++--,就默认是+1或者-1

指针类型可以做加法、减法,但是不可以做乘除运算

	char* a;
	short* b;
	int* c;
	a = (char*)5;
	b = (short*)5;
	c = (int*)5;
	a = a + 5;
	b = b + 5;
	c = c + 5;

那么我们如果,不让他自加了,开始都加5,那么结果是多少?
在这里插入图片描述
可能又和我们想的不同,因为1个星,去掉之后字节宽度还有1、2、4
1+5=6、2+5=7、4+5=9,那么为什么出来了10、15、25

因为char去掉*还有1字节,已经赋值给a为5
所以 a = 5 + 1*5 =10
b就 = 5 + 2*5 = 15
c就 = 5 + 4*5 = 25

所以规律如下:

指针变量 + N(要加上的数值) = 指针变量 + N*(去掉*号后指针的宽度)
就像
char* a;
a = (char*)5;
a = a + 5;
那么指针变量就是a,n就是5
a+5 = a本来就为5 + 5*1,因为char*去掉1个后,为1字节
a = 5+5 = 10

减法规律如下:

指针变量 - N(要加上的数值) = 指针变量 - N*(去掉*号后指针的宽度)

就像
char* a;
a = (char*)5;
a = a + 5;
那么指针变量就是a,n就是5
a-5 = a本来就为5 - 5*1,因为char*去掉1个后,为1字节
a = 5-5 = 0

所以按照我们的思路
a = a + 5;
b = b - 5;
c = c - 5;
a = 5 - 5*1 = 0
b = 5 - 5*2 = -5
c = 5 - 5*4 = -15

5. 指针类型的比较

#include <stdio.h>
#include <windows.h>
void main()
{
	int* c;
	int* d;
	c = (int*)5;
	d = (int*)10;
	if (c < d)
	{
		printf("1 \n");
	} 
	else
	{
		printf("2 \n");
	}
	system("pause");
	return;
}

在这里插入图片描述
现在看着指针和普通类型,无法从汇编角度区分,所谓的指针代码等,都是写给编译器看的,真正编译出来的时候,起始差异不是很大,但是还是有差异的。我们也看到,比较用的jae/jbe,这两个是判断无符号的,所以指针严格来讲,是个无符号的类型

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值