本帖最后由 gdmgb520 于 2011-3-21 22:26 编辑
想去找一个嵌入式的工作,发现C语言太弱了。好好学学。
----------------------------------------------------------------------
指针与内存(1).rar
(5.53 KB)
word文档
---------------------------------------------------------------------
首先需要明确,指针就是地址,变量的指针就是变量的地址。存放变量地址的变量就是指针变量,它用来指向另一个变量。
#include <msp430x22x2.h>
char i;
char * pointer_1;
char a;
int j;
int * pointer_2;
int b;
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
i = '0';
j = 5;
pointer_1 = &i;
pointer_2 = &j;
a = * pointer_1;
b = * pointer_2;
return 0;
}
初始化后内存分配如下:
内存地址
| 内存内容
| 变量名
| 0x200
|
| Pointer_1
|
|
| 0x202
|
| j
|
|
| 0x204
|
| Pointer_2
|
|
| 0x206
|
| b
|
|
| 0x208
|
| i
| 0x209
|
| a
|
|
|
|
程序运行情况分析:
所有变量定义为全局变量时为了在Watch窗口中方便查看。这样定义实际上对变量分配的内存空间是不一样的,回头再研究。全局变量的内存空间是分配在静态区的。在内存中数据的低字节存放在内存的低地址中。
首先,16和17行,对i j 赋值,操作的结果是使0x208空间存入0x30,使0x202空间和0x2.3空间分别存入0x05和0x00。
18,19行,给指针变量赋值,把i
j 的地址存入指针变量。操作的结果是内存空间0x200和0x201分别变成了0x08和0x02,可看到对应的汇编代码是 mov.w #0x208,&pointer_1,即把立即数移入pointer_1变量对应的内存空间。内存空间0x202和0x203的内容更新为0x02和0x02。
20,21行,指针运算,通过指针变量进行间接访问。把pointer_1变量中存放的指针(地址)所对应的数据存放到变量a中。操作结果是把0x200呢0x201内存中存放的数值 (0x208)所对应的地址内的数据(0x30)存入0x209内存空间。21行,把内存0x204空间存放的地址(0x202)中的数据(0x0005)存入b变量(内存空间0x206)内,即0x206和0下0x207空间为0x05和0x00。
汇编代码如下:
main:
?cstart_end:
00E018
40B2 5A80 0120
mov.w
#0x5A80,&WDTCTL
i = '0';
00E01E
40F2 0030 0208
mov.b
#0x30,&i
j = 5;
00E024
40B2 0005 0202
mov.w
#0x5,&j
pointer_1 = &i;
00E02A
40B2 0208 0200
mov.w
#0x208,&pointer_1
pointer_2 = &j;
00E030
40B2 0202 0204
mov.w
#0x202,&pointer_2
a = * pointer_1;
00E036
421F 0200
mov.w
&pointer_1,R15
00E03A
4FE2 0209
mov.b
@R15,&a
b = * pointer_2;
00E03E
421F 0204
mov.w
&pointer_2,R15
00E042
4FA2 0206
mov.w
@R15,&b
return 0;
00E046
430C
clr.w
R12
00E048
4130
ret
__exit:
00E04A
120A
push.w
R10
00E04C
8321
decd.w
SP
00E04E
4C0A
mov.w
R12,R10
00E050
4A81 0000
mov.w
R10,0x0(SP)
小结:
做这样的理解,在C语言中,变量名就是内存地址,访问一个变量名实际上就是取得这个变量名所代表的地址空间中存放的数据,而指针变量也变量,所以访问指针变量也会得到指针变量名所代表的内存空间中的数据,而指针变量中存放的数据一个地址,通过使用“简介访问”运算符“*”就可以访问到这个地址内的数据,这样就取得了指针变量所指的数据。
|