指针类型
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,这两个是判断无符号的,所以指针严格来讲,是个无符号的类型