summary

一、关于二维数组的学习。

1、测试过程

关于二维数组自己其实学的差不多了,但发现二维数组作为形参时自己理解的还不是很到位,特此写下来测试demo分析。
summary
​​编译过程发现:
summary
运行结果:
summary
总体来分析:总体结果符合预期,就是用二重指针这个地方为什么会段错误?

2、汇编代码分析

summary
summary
summary
summary
summary
分析如下:二维数组名本身还是一个指针,只不过是一个特殊类型的指针(数组指针),代表这个数组的首地址,我们定义参数为int array[3][5]或者int (*array)[5]时,会告诉编译器:这是一个数组指针,因此c标准规定取元素时必须**array而且跨度是一维数组的长度,但编译完以后的汇编代码可以看到只是取了一次地址(ptr),可以看到array = array.

对于一维数组,只有当数组名在表达式中使用时,编译器才会产生一个指针常量,形参会把指针常量赋给一个指针(顶层const)。而只有以下两种情况,才不被当做指针常量(来自c和指针P141),.

①、sizeof(数组名),返回的是数组长度,而不是指向数组的指针长度,编译时一般都会确定。

②、&数组名,产生一个指向数组的指针,而不是指向某一个指针常量的指针。
summary

二、关于函数栈的学习。

验证csdn上的评论:形参也占用栈内存。
summary
其实下面的图中右边的图是不正确的(2和4在上面),早期的CISC结构是栈密集型,参数的传递是通过调用者存储,具体可以参考汇编代码。其实后来的CISC也可以用寄存器传递参数(6个,参考CSAPP)。
summary