C++ 类似于汇编的指针访问

标签 c++ arrays pointers assembly

有时我在 C++ 中看到不同的数组访问样式,并认为它可能与程序集寻址模式有关:

C++:

int * aa=new int[2];
0[aa]=15; //a little different than aa[0]
1[aa]=15;
aa[0]=15;
aa[1]=15;
printf("%d %d \n",aa[0],aa[1]);

程序集:

__asm
{
    mov aa[0],ebx
    mov aa[1],eax
    mov 0[aa],ebx
    mov 1[aa],eax
}

此 C++ 数组访问表示法是否为标准?如果是,它是否源自汇编寻址模式?

当我尝试 [aa]1=5; 时,编译器给出

  • “未找到 aa 属性”,
  • “缺少';'在‘常量’之前”
  • “左操作数必须是左值”。

    //当我尝试指针运算时,

    *(aa+1)=0//没有报错

    *(aa+0)=0//没有报错:)

运算符 [] 重载的规则是否相同?

MSVC++ 2010

谢谢。

最佳答案

这是 C 和 C++ 的一个众所周知的怪癖,它们并不真正关心表达式的哪一半放在方括号 [] 中。它们都计算为相同的等效表达式:

*(0+aa)=15;

关于C++ 类似于汇编的指针访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355464/

相关文章:

c++ - 我还是不明白 C++ operator new[] (or new[][])

c++ - 为什么不在这个静态库中创建多个已定义的符号?

arrays - 在数组中搜索特定范围内的整数

python - 获取任何偶数维度的 2D 列表,并返回一个包含每个 2 X 2 网格的事物计数的列表 (Python)

c++ - 指针数据变化

c - 将两个指针数组合并为 C 中的第三个指针数组

Javascript:将两个对象合并为一个

c++ - 每次成功编译后运行单元测试

C++ 外观避免复制

javascript - 如何使用过滤值从旧对象创建新对象