0x01.指针的声明
char x; char* x;
short y; short* y;
int z; int* z;
float f; float* f;
double d; double* d;
Struct st; Struct* st;
从这边可以总结出来
1、带有 * 的变量标准写法: 变量类型* 变量名
2、任何类型都可以带* ,加上以后就是新的类型,统称 “指针类型”
3、可以是任意多个
0x02.指针变量赋值
赋值有两种形式
int x = 10;
int* i;
i = &x;
printf("%#X", i);
这边其实用到了取址符(&),也就是取出x变量的地址
这边可以发现单单是变量i,没有加*
的话,是存储x的地址
i(0x4FF718) = x = 10
这时候我们想得到i的值,我们就得再i那边加个*号
发现成功打印出了值,这时候我们可以小总结一下了;
1、&
号是取址,取出指定变量的地址
2、*
号是取值,取出内存地址上面的值
int* i;
char* x;
short* b;
i = (int*)10;
x = (char*)10;
b = (short*)10;
这种方式的赋值其实就是强转
0x03.指针变量宽度
总结:指针类型的变量永远是4字节,无论类型是什么,无论有几个*
可以写一段代码看一下
int main()
{
char* i;
i = (char*)10;
return 0;
}
正常情况下char是1字节,byte;但是因为加了个*,变成了指针类型,所以是4字节,也就是dword类型
从这边我们就可以验证了刚刚所想的
0x04.指针类型自增自减
char a = 100;
short b = 100;
innt c = 100;
a++;
b++;
c++;
总结:
1、不带类型的变量,++或者--都是加1 或者减1
2、带类型的变量,++或者--新增(减少)是去掉一个*后变量
例子:
比如short是4字节,但是要++的时候,++的宽度是去掉后的宽度
short* a = 10;
a++;
a = 12
因为short去掉*后是2字节,所以1 乘 2 等于2
0x05.指针类型加减法
char* a = 100;
short* b = 100;
int* c = 100;
a = a+5;
b = b+5;
c = c+5;
总结:
1、指针类型的变量可以加、减一个整数,但不能乘除
2、指针类型变量与其他整数相加或者相减时:
指针类型变量 + N = 指针类型变量 + N 乘 (去掉一个*后类型的宽度)
0x06.指针类型比较
int main()
{
char* i;
char* b;
i = (char*)10;
b = (char*)11;
if (b>i)
{
printf("b > i");
}
return 0;
}
探测&变量的类型
&是取地址符,任何变量都可以使用& 来获取地址,但是不能用在常量上。
char a;
short* b;
int** c;
int x =&a;
int x = &b;
int x = &c;
可以得出编译器把 &a 当做char * 看待
总结: 只要有&这个符号,那么编译器会把原本的类型加上个*看待
我们再举个例子
这时候short 原本就有一个了,但是因为值用了取址符(&),所以就在原本的类型再加个*