通过指针进行内存访问比通过数组进行内存访问更有效.我正在学习C,上面的内容在K&R中有说明.他们特别说
通过数组下标可以实现的任何操作也可以使用指针来完成.指针版本通常会更快
我使用visual C++解组了以下代码.(我是一个686处理器.我已禁用所有优化.)
int a[10], *p = a, temp;
void foo()
{
temp = a[0];
temp = *p;
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,我看到通过指针的内存访问需要通过数组对内存访问所采用的两条指令.以下是相应的代码.
; 5 : temp = a[0];
mov eax, DWORD PTR _a
mov DWORD PTR _temp, eax
; 6 : temp = *p;
mov eax, DWORD PTR _p
mov ecx, DWORD PTR [eax]
mov DWORD PTR _temp, ecx
Run Code Online (Sandbox Code Playgroud)
请帮我理解.我在这里失踪了什么?
正如许多答案和评论所指出的那样,我使用了编译时常量作为数组索引,从而使得通过数组访问变得更容易.下面是汇编代码,其中变量作为索引.我现在有相同数量的指令通过指针和数组进行访问.我更广泛的问题仍然很好.通过指针进行内存访问并不会使其本身更有效.
; 7 : temp = a[i];
mov eax, DWORD PTR _i
mov ecx, DWORD PTR _a[eax*4]
mov DWORD PTR _temp, …Run Code Online (Sandbox Code Playgroud) 我是编程的初学者,正在尝试一些组合.
#include<stdio.h>
int main()
{
int a=5;
printf("%d",&a); // STATEMENT 1
printf("\n%d",a); //STATEMENT 2
printf("\n%d",&(a++)); //STATEMENT 3
printf("\n%d",a); //STATEMENT 4
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在STATEMENT 3中说错了
[错误]左值作为一元'&'操作数需要
我期望STATEMENT 1和3的输出相同,因为两个地址都是相同的.
我还期望STATEMENT 2的输出为5&STATEMENT 4为6.
我抬起头,发现了一个类似的问题:Lvalue需要错误
我在那个问题上理解了这个问题.从评论到上面提到的问题的第一个答案,我认为左值是可以存储某些东西的东西.
但我仍然无法理解为什么&(a ++)或&(++ a)应该给出错误.任何帮助将不胜感激.
谢谢您阅读此篇.
[编辑]感谢您的回答.如果可能的话,请包括参考,其中讨论了这些表达的确切执行顺序或性质.这样,像我这样的新手不会因为这些微不足道的问题而困扰社区.
可能重复:
左值必需错误
我的C程序出错了
main () {
int arr[] = {1, 2, 3, 4};
printf("%d", *arr);
arr++;
printf("%d", *arr);
}
Run Code Online (Sandbox Code Playgroud)
当我编译这段代码时,我得到左值所需的错误.对于带有arr ++的行.任何帮助!