|
|
发表于 2013-12-31 15:13:14
|
显示全部楼层
本帖最后由 向往青莲 于 2013-12-31 15:15 编辑
maca 发表于 2013-12-31 12:49
谢谢你~
我使用的是linux 64位元系统,
我想请问一下, 您是如何得知a的时候要先拷贝到堆栈的?
既然是64位系统,那么你编译的是32位程序还是64位程序?(ps, 我猜测应该是32位
程序)
首先回答我是如何得知a的时候要先拷贝到堆栈-->我调试得知的
首先明确一个概念,任务结构的结构名要解释成地址的话就是该结构的首地址,
我们得到结构是需要结构首地址,和结构大小的。。。(当时我是这么说,肯定是错
的。。你暂时这么理解吧。。)
就你这个程序。。。。array是代表“int array[2] = {};”这个数组的首地址
那么“int array[2] = {};”这个数组的首地址就是0x7fff554bab2c(因为是64位系
统),而&array代表的意义是取“int array[2] = {};”这个数组的地址,你要知道
array既可以代表这个数组,也可以代表这个数组的首地址,所以array和&array的
意义是一样的,二者没有区别--->
array---->数组首地址
&array--->取这个数组结构的首地址
你自己想想,体会一下
array+1就是array[1]的意思
array[1]是可以看做是简写的array+1
懂?
而&array。。正如上面所说的是去结构的首地址(在本例中当然是数组结构了。)
那么这是的array这个单词是基于什么单元呢?就是结构单元,
也就是说&array+1,,,这是的+1就不是+1个int那么简单,而是array这个结构大小
你不信可以试试(char*)array + sizeof(array) 和 &array + 1是相等的。。。
&array+2就是(char*)array + 2*sizeof(array)
//注意体会(char*)这个强制转换的作用。。。。
array + 1 = array[1] = (char*)array + sizeof(array[0])
array + 2 = array[2] = (char*)array + 2*sizeof(array[0])
&array+1 = (char*)array + sizeof(array) &array+2 = (char*)array + 2*sizeof(array)
注意上面都用了(char*)强制转换,是为了让 array+5 = array+5,而不是array+5 = array + 5*(sizeof(int))
你自己体会下吧。。。。。。
|
|