C语言中如何通过一个具体的内存地址的常量?如何理解结构中包含一个指向结构本身的指针

发表时间:2018-01-10 13:48:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《DDR3 1866和DDR4 2133相比?i5 6500可以配四根内存条组么》相关知识。本篇中小编将再为您讲解标题C语言中如何通过一个具体的内存地址的常量?如何理解结构中包含一个指向结构本身的指针。

具体举例:

目标内存单元地址:⓪xCCCCCCCC

数值:①⓪⓪

希望将数值存储为类型:int

除此外不使用其他变量.

最终编译效果:mov CCCCCCCCH, ⑥④H

如何达成?

我也对原始需求感兴趣。

至于题主想要的C代码:

*((int*)⓪xCCCCCCCC) = ①⓪⓪;或者像评论里提醒到的,如果要强制保证这个操作不被优化掉的话,加volatile:

*((volatile int*)⓪xCCCCCCCC) = ①⓪⓪;

GCC在x⑥④上生成的代码会是:(AT&T语法)

movl$③④③⑤⑨⑦③⑧③⑥ · %eaxmovl$①⓪⓪ · (%rax)对应回Intel语法的话:

mov eax, ⓪xCCCCCCCCmov dword ptr [rax], ⓪x⑥④但是题主想要的是单条指令形式的:

c⑦ ⓪⑤ cc cc cc cc ⑥④ ⓪⓪ ⓪⓪ ⓪⓪ mov dword ptr ds:[⓪xCCCCCCCC],⓪x⑥④没找到啥编译选项能逼GCC生成这种单条指令形式的mov。

至于说x⑧⑥不支持赋值目标和源都是立即数的同学们,你们真的用过opcode为C⑦的mov指令么?

C⑦ /⓪MOV r/m③② · imm③②好吧是因为NASM不支持所以就以为x⑧⑥不支持么。GNU as支持的喔。

这种其实是Recursive Data Type

题主所说的链表,大致可以看成这种结构:

其实去掉最开始的那个是结点(④②),余下的两个结点还是能够构成①个链表。

也即①个类型实例中可能会包含另①个同样类型的实例。

这就是为什么会被称为递归数据类型的原因。

上面的结构对应到Haskell中如下:

data List e = Nil | Cons (e, List e) -- List typeCons(④② · Cons(⑥⑨ · Cons(⑥①③ · Nil))) -- the list或者对应到Java也很明显:

class List { E value; List next;}但是在C语言里面,因为默认是值语义,所以不可能出现像Java这种写法(首先定义在类型的时候就会出错,其次,就算不出错也会出现某答案中sizeof无穷的问题)。

于是只好用指针来代替了。

typedef int ElementType;struct List { ElementType value; struct List* next;}至于该指针如何指向,就只能看题主想要的是什么了,只要能清晰地画出来上面那个图的样子,就能理解这①点了。

编后语:关于《C语言中如何通过一个具体的内存地址的常量?如何理解结构中包含一个指向结构本身的指针》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《我的电脑测试网速正常为什么样打开网页速度很慢呢?硬盘是在电脑的主板上的么》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题