【C/C++】知识点笔记

1 - 联合体内嵌结构体初始化赋值

union {
struct {
int i;
float f;
char *p;
};
int o;
} obj3 = { 1, 2.2, "sk", 4, 9 };
printf("struct inlay union: %d, %f, %s, %d\n", obj3.i, obj3.f, obj3.p, obj3.o);

输出:

struct inlay union:  1, 2.200000, sk, 1

说明:

a.  在union中,所有的成员共享同一块内存空间。这意味着,在任何给定的时间,只有一个成员可以持有值。在上述代码中,union的初始化是匿名的,所以是对其第一个成员(一个struct)进行的。因此,o成员并没有被初始化

b.  若要o成员生效,就需要显示初始化,即 obj3 = { 1, 2.2, "sk", .o=4, 9 };

c.  初始化成员个数超过定义的成员个数,则超出的赋值会忽略,但还是建议按个数赋值

 

2 - C/C++内嵌汇编

Using Assembly Language with C (Using the GNU Compiler Collection (GCC))

__asm__ __volatile__(
"assembly code"
: output operands // 输出操作数
: input operands // 输入操作数
: clobbered registers // 受影响的寄存器列表
);
__asm__ __volatile__(
"str sp,[%0] \n"
"bx lr \n"
:
: "r"(&regs), "r"(sp_saved)
: "r0"
);

说明:

a.  str sp,[%0]:表示将寄存器sp中的值存储到内存地址[%0]中。[%0]是通过第一个输入操作数&regs指定的内存地址。

b.  bx lr:表示执行跳转到寄存器lr所指向的地址,\n 分割汇编指令。

c.  : "r"(&regs), "r"(sp_saved):这是输出操作数和输入操作数的部分。

c.1  "r"(&regs):表示将&regs的地址存储到一个寄存器中,供汇编代码使用。

c.2  "r"(sp_saved):表示将sp_saved的值存储到另一个寄存器中,供汇编代码使用。

d.  : "r0":这是受影响的寄存器列表,表示在内嵌汇编代码执行过程中可能会修改寄存器r0的内

 

posted @   壹点灵异  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示