float x[3][5]; 数组x占多少个字节?

x 是一个浮点数组,有 3 行 5 列,1 5 个元素,每个元素包含 4 个字节,总共 6 0 个字节。
IEEE7 5 4 标准允许浮点数包含 3 2 位,从而提高持久存储的效率。
在 x8 6 架构上,浮点数通常为 4 字节,但在其他架构上可能有所不同。
这与谈判任务和性能优化有关。

一个字符数组占多大的内存空间啊?

你说得对,这个逻辑没有问题。
行数乘以列数乘以每个元素的字节数得出总空间。
然后分别统计第8 列和第5 行的空格,你会发现第8 列和第5 行的元素被统计了两次,所以需要减去一次。

按照你的计算,第8 列总共5 4 个字节,第5 行总共6 0个字节,减去6 个重复字节,就是1 08 个字节。
这个计算方法没有任何问题,很清楚。

需要注意这种类型的重复计算,很容易被忽略。
你是对的。

设W为一个二维数组,其每个数据元素占用4个字节,行下标i从0到7

W[6 ,3 ]之前有2 7 个元素,起始地址是2 08
这是一个陷阱。
不要使用数组索引直接计算内存地址。

首先计算偏移量,然后加上数组的起始地址。

为什么数组占用的是一个字节的内存?

那天我在写代码,定义了一个字符数组char array[6 ] = "hello";,但是编译器提示我占用了6 个字节。
我就想,这6 个字节是怎么分配的呢? 字符串“hello”只有 5 个字母。
第五个字母“​​o”后,系统自动添加“\0”,占用一个字节。
因此,总共 6 个字节。

等一下,还有一件事。
我用了 char array[5 ] = "hello"; 之前,但是编译器报错说数组太小了。
当时我就明白了'\0'是必须的,不能省略。
数组是连续存储的,'h'、'e'、'l'、'l'、'o'、'\0',一个接一个,顺序不能乱。

我尝试使用char array[1 0] = "hello";,编译器是对的,只是最后5 个字节是随机值,不影响前6 个字节。
这意味着定义数组时,大小必须大于等于字符串长度加1
我突然想到,如果 char array[6 ] = "world"; 定义后,“world”是 5 个字母,加上 '\0',即 6 个字节。
这与 char array[6 ] = "hello"; 占用相同的空间。
这说明,无论字符串有多长,只要数组定义的大小足够,系统都会分配实际字符串长度加1
数组是元素的有序序列,之前对此理解不够深入。
例如array[0]是'h',array[1 ]是'e',并且不能颠倒。
下标从0开始,这是C语言的约定。
如果写成 char array[] = "hello";,编译器会自动根据字符串的长度分配大小。
此时数组为6 字节。

我还在想,如果定义char array[6 ] = "hello world";,编译器会报错,因为字符串太长,超过了数组大小。
如果写成 char array[1 2 ] = "hello world"; 就会成功,因为 "hello world" 加 '\0' 正好是 1 2 个字节。

等等,还有一个细节。
如果字符串的长度加上'\0'正好等于数组的大小,比如char array[6 ] = "hello\0";,这样也可以,因为'\0'表示字符串结束。
但是 char array[6 ] = "hello"; 后面会自动加上'\0',所以看起来是一样的。

数组是你用得太多之后就会习惯的东西。
但每次遇到字符串和数组的组合,我还是会想,系统是怎么处理的? '\0'是怎么加的? 它是如何在内存中连续存储的呢?
这个问题我想了很久,不知道还有没有更深层次的细节。
无论如何, char array[6 ] = "hello"; 占用6 个字节,这是事实。
但不知道在内存中的具体排列顺序以及编译器是如何优化的。