Arrays
注意机器级代码里面是没有数组这一概念的,而是将其视为字节的集合,结构也是如此。
然后C编译器的工作就是生成适当的代码来分配该内存,从而当你去引用结构或者数组时给你正确的值
Array Allocation
一个char数组一个字符是一个字节,双精度或长整数则是8个字节,指针也是八个字节,int是四个字节。
Array Access
注意c语言中没有边界检查,下标变成负数的时候,会给你一个未定义的值!
Ip...val+i会被缩放。计算出的值将是起始地址加上4倍的i,不管i是什么。
Array Accessing Example
rdi是基地址,rsi存放偏移的地址。
Array Loop Example
老师说了一个问题 C语言中指针和数组的真正区别是什么?
对下面的每个An
(1)是否能通过编译,在C语言中是合法语言吗
(2)其次,这可能会给我一个空指针引用吗?因为我正在引用一个指针,我们实际上没有为他指示的空间分配内存
(3)最后,如果在那个值前面用sizeof运算符,同时包括前面有*的情况
在C中声明数组的时候,既在分配空间,同时也正在创建一个允许在指针运算使用的数组名字。
但是声明指针的时候,分配的只是指针本身的空间,而没有给他指向的空间。
上图中,注意[]的优先级比*号高,还要注意的是上面使用了数组指针,具体的解释可以看<C语言中文网上面的解释>
Multidimensional (Nested) Arrays
上面这种排序方式是行优先
Nested Array Row Access
Multi-Level Array Example
Structures
Satisfying Alignment with Structures
Saving Space
将大的数据类型放在前面,这样的话更有效率。
Floating Point
floating point基础
FP Memory Referencing