c语言允许直接访问内存地址吗

c语言允许直接访问内存地址。c语言可以通过“变量名”直接内存;例如使用“int a;”语句定义了一个变量a,那么直接给变量名赋值“a = 5;”,就可直接访问量内存地址。

本教程操作环境:windows10系统、c99版本、Lenovo 小新Air14电脑。

汇编语言寄存器间接寻址方法

#define GPJ0CON		0xE0200240
 
ldr r0, =GPJ0CON      //把地址值赋给寄存器r0,从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断这个数
ldr r1, =0x11111111   //将设定的数暂存到寄存器r1中
str r1, [r0]          //寄存器间接寻址。功能是把r1中的数写入到r0中的数为地址的内存中去

ldr(load register)指令将内存内容加载入通用寄存器。

str(store register)指令将寄存器内容存入内存空间中。

ldr/str组合用来实现 ARM CPU和内存数据交换

C语言中访问内存地址的方法

1)用指针间接访问内存

C语言中访问内存地址的方法如下片段。在ARM中(统一编址),寄存器的地址类似于内存地址(IO与内存统一编址的),所以 这里的问题是用C语言读写寄存器,就是用C语言来读写内存地址。用C语言来访问内存,就要用到指针

#define GPJ0CON		0xE0200240
 
unsigned int *p = (unsigned int *)GPJ0CON;    //注意ARM中常用无符号整型指针,(unsigned int *)是强制类型转换,让等号两边类型匹配
*p = 0x11111111;             //解引用,间接改变GPJ0CON地址中存的数

可以看出,C语言间接访问内存地址的方式是通过指针间接访问。

2)C语言通过(变量名)直接内存

假如定义了一个int a;那么直接给变量名赋值a = 5; 这样的方式就直接访问量内存地址

int a;    /* 编译器帮我们申请了1个int类型的内存格子(长度是4字节,地址是确定的,但是只有
          编译器知道,我们是不知道的,也不需要知道。),并且把符号a和这个格子绑定。*/
a = 5;    // 编译器发现我们要给a赋值,就会把这个值5丢到符号a绑定的那个内存格子中。

【扩展】C语言中函数:一段代码的封装。

函数名的实质:就是这一段代码的首地址。所以说函数名的本质也是一个内存地址

【注意】内存单元格子的编址单位是字节

以上就是c语言允许直接访问内存地址吗的详细内容,更多请关注易知道|edz.cc其它相关文章!

推荐阅读