数组名与指针到底有什么区别

白癜风应该怎么样治疗 http://pf.39.net/bdfyy/bdfyw/140427/4380186.html

今天让我们从汇编的角度去理解数组名与指针的区别,两者之间的联系与区别在网上有太多关于这方面的文章了,也有C语言书提到过,比如C和指针,C专家编程,可是真正让我有深刻认识的是通过看了汇编代码之后.看下面简单的代码语句

定义两个指针变量和一个数组,其中一个用数组名赋值,一个用指针变量赋值,再看他们的汇编代码,我是尽量的让代码简单了!

作为一名C/C++程序员或立志成为一名C/C++程序员的猿友们,上面的几行汇编代码不要告诉我看不懂哈.

movdwordptr[ebp-4],0//对应的是int*p=NULL;这条语句,从汇编的角度看就是把0赋给ebp-4指向的内存单元.

moveax,dwordptr[ebp-4]和movdwordptr[ebp-8],eax//对应的就是int*c=p;这条语句,先把dwordptr[ebp-4]指向的内容赋给eax,再通过eax中转一下赋给dowrdptr[ebp-8]指向的内存空间.(介绍一下汇编的基本知识,在汇编中源操作数据和目的操作数不能同时是内存变量,所以在这里有个eax中转啦,一个简单的C语言赋值语句,就包含了CPU对变量的读和写.所以编写多线程往往新手很容易出错且还不知道出错在哪里)

leaecx,[ebp-88h]和movdwordptr[ebp-4],ecx//这句对应的是p=a;这里通过ecx中转了一下,注意这里用的lea指令,它与mov的区别是:mov把指向的内容赋给目的操作,而lea是把直接把地址赋给目的操作数.即ebp-88h赋给ecx.显然这里的a就对应ebp-88h这是一个地址常量!我想我们应该把指针和指针变量好好的区分开来,指针就是地址,指针变量是保存指针的变量,数组名就是地址,理解为就是地址的别名,一个地址和一个保存地址的变量肯定就不相同了.




转载请注明:http://www.aierlanlan.com/grrz/2179.html