CMU 15-213 Introduction to Computer Systems学习笔记(7) Machine-Level Programming-Data

本文深入探讨C语言中的数组和指针概念,解析两者之间的微妙差异,以及在内存分配、边界检查和多维数组处理上的具体实现。强调数组在声明时即分配空间的特点,与仅分配自身空间的指针形成对比。

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

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值