欢迎光临散文网 会员登陆 & 注册

指针(类型+地址)

2020-11-26 13:59 作者:开源开发者  | 我要投稿

指针就是类型+地址

指针=(int*)进程的虚拟地址     这里的int*表示强制转换整数为int虚拟内存地址的常量指针

在c语言中,为了表示指针变量和它所指向变量之间的联系,用“*”表示指向。

例如:

int i,*ptr1;

ptr1=&i;

*ptr1=100;/*把100存入ptr所指向的变量i中*/

等同于:i=100;

又如:

char ch,*ptr2;

ptr2=&ch;

*ptr2+=32;/*把ptr2所指向变量ch中的值加32*/

相当于:ch+=32;

ch=*ptr2;相当于:ch=i;

应当注意的是,在变量声明中的“*”和表达式中的“*”意义是不一样的,变量声明中的“*”意味着定义一个存放指针的指针变量,而表达式中的“*”表示间接存取指针变量里的指针所指向变量的值。在编程序是经常用到。

mov 的第 1 操作数表示传输“源”,第 2 操作数表示传输“目标”。例如“mov 内存 , 寄存

器”表示将内存中的值加载到寄存器。

实际在编写指令时,还需要根据所传输的数据的大小添加助记符后缀。例如将 32 位宽的立

即数 105000 加载到 eax 寄存器时,要加上后缀 l,写成下面这样。

movl $105000, %eax

将寄存器 ecx 中的值转移到 eax 寄存器的写法如下所示。

movl %ecx, %eax

最后,将 ecx 寄存器中的数据作为地址访问内存,并将内存上的数据加载到 eax 寄存器中

的写法如下所示。

movl (%ecx), %eax

不习惯汇编的话会觉得 %ecx 和 (%ecx) 的区别难以理解,可以把它当作 C 语言的指针。

指针变量 ptr 自身的值等同于 %ecx 的话,那么对指针的取值操作 *ptr 就相当于 (%ecx)。

另外,%ecx 是访问寄存器,而 (%ecx) 则是利用寄存器访问内存。

C 语言的指针就是保存虚拟地址的数据类型。例如将整数 15000 强制转换为 char* 类型并

访问,就能够得到该进程的地址空间中 15000 地址上的值。

如果下面出现b = a;那么它就会根据符号表找到变量的真正的物理位置,取得它的值,赋给b。

我们再定义一个变量 a 时,变量 a 本质上代表一个存储单元,CPU通过该存储单元的地址访问该存储单元中的数据。所以a本来代表两个值:存储单元的地址和储单元中的数据。于是就有了二异性。为了消除这种二义性,a存储单元中的数据可以是一个普通数值,也可以是另一个存储单元的地址,比如:a = &b; 语句就是将b的存储单元的地址存入a存储单元中。


指针(类型+地址)的评论 (共 条)

分享到微博请遵守国家法律