指针的相关知识

来源:百度知道 编辑:UC知道 时间:2024/05/30 17:31:17
(千万别COPY现成的指针书本,我就是看不懂书本才问的)

汇编的指针类似这样
0000H mov ax,[1050]
1050H 30
这样,ax就变成30了。

那么,如何把C的指针和上述的汇编指针联系起来来学呢?

懂汇编,就懂指针。因为指针实质上就是地址。以你的汇编为例:
1050H DB 30 相当于 char n = 30, &a(a的地址)就是1050H.
如果有个 char *p, p的值也是1050H, 那么 mov ax,[1050] 相当于 ax = *(p=0x1050); 所以ax就变成30了。

>int *abcdef,是不是已经定义了两件东西,一个是内存地址(abcdef,是不用管具体内存地址是多少的),
>另一个是该地址放了个什么数据(*abcdef)。我理解对了吗?
C里的 int *abcdef; 是确定了一节内存,其长度是sizeof(int *)字节, 其值不定, 其地址在运行前载入程序时确定(如全程变量及静态变量); 或者在运行期间才分配(如局部变量).仅仅这些而已.他的值是不定的, 我们将在这个地址存放一个指针(地址), 指向一个整型数据.(汇编的说法就是存放一个整型数地址)。他连指向哪里都不确定,何谈他指向的整数是多少呢. abcdef是他的记号. 如同汇编:
abcdef DW ?

C里如果用全程变量或静态变量说明:
int xyz, *abc=&xyz;
相当于汇编的:
xyz DW ?
abc DW xyz
至于xyz的值是多少,也就是说*abc的值是多少,在这里并不涉及。

运行过程中如果有:
abc = &xyz; // abc指向xyz;
*abc = 7; // 把abc指向的地址改写为7, 也就是相当于 xyz=7.
相当于汇编的:
MOV si, offset xyz
MOV abc, si
MOV word ptr[si], 7

写一段C代码,然后看其汇编代码,VC有这种功能