什么是取地址符
顾名思义,就是获取当前变量的内存地址,想要获得那个变量的地址,就用&后面跟上那个变量。
使用方法
在输出的时候后面跟上变量名就行,看一下这个例子:
#include <stdio.h> //头文件
#include <windows.h>
struct player //定义结构体
{
int x; //定义变量
int y;
};
char a; //定义变量
short b;
int c;
void main() //程序入口
{
a = 1; //给变量赋值
b = 2;
c = 3;
player p = {10,20};
printf("%x %x %x %x \n",&a,&b,&c,&p); //输出变量内存地址
return; //程序结束
}
运行结果:
内存地址输出了,我们去反汇编看一下:
注:&后只能跟变量,不能跟常量,因为常量是一个立即数,不是容器,没有地址。
探测&变量的类别
看一下代码:
#include <stdio.h>
#include <windows.h>
char a;
int x = &a;
void main()
{
return;
}
这样运行是会报错的:
这里的意思是:没有办法把char* 转换成int,那这里x是int,&a就是char了,他在我们原来定义的类型基础上加了一个,我们在做实验,把char a改为char* a试一下:
#include <stdio.h>
#include <windows.h>
char* a;
int x = &a;
void main()
{
return;
}
运行结果:
这里可以得出结论,如果变量类型对不上,他就会在原先变量类型的基础上加一个*
指针变量赋值
结合上面的实验,我们可以写出这段代码:
#include <stdio.h>
#include <windows.h>
char x;
char* p1;
char** p2;
char*** p3;
char**** p4;
void main()
{
p1 = &x; //char*
p2 = &p1; //char**
p3 = &p2; //char***
p4 = &p3; //char****
return;
}
运行结果:
这样就不会报错了,这是因为我们赋的值刚好跟目标类型对应起来了。