You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言数组与指针的关系及RAM存储相关疑问

关于C语言数组存储与指针关系的澄清

一、数组在RAM中的连续存储

你看到地址间隔为4而非1,是因为**int类型在你的系统中占4字节**。数组的“连续存放”指的是:每个元素的起始地址紧接上一个元素的末尾地址,元素之间没有空隙。

以你的int arrays[3]为例:

  • 第一个元素arrays[0]地址是973077712,它占用973077712~973077715这4个字节
  • 第二个元素arrays[1]的起始地址就是973077716(973077712+4),正好是前一个元素的末尾下一位
  • 第三个元素同理,起始地址是973077716+4=973077720

这完全符合“连续存放”的定义,只是地址的增量等于元素的字节大小,而非固定的1。如果换成char类型数组,地址间隔就会是1,因为char占1字节。

二、数组名与指针的关系

首先明确:数组不是指针,但在多数表达式场景中,数组名会被隐式转换为指向其首元素的指针。

关于arrays和&arrays地址相同的问题

  • arrays在表达式中会转换为int*类型,指向arrays[0]的地址
  • &arrays的类型是int (*)[3](指向包含3个int的数组的指针),它指向的是整个数组的起始位置

因为整个数组的起始地址和首元素的起始地址是同一个位置,所以两者的数值相同,但类型完全不同:

  • 执行arrays + 1,会按照int*的步长(4字节)跳转,指向arrays[1]
  • 执行&arrays + 1,会按照整个数组的大小(3*4=12字节)跳转,指向数组末尾的下一个位置

你可以用这段代码验证类型差异:

#include <stdio.h>
int main() {
    int arrays[3] = {10,20,30};
    printf("arrays + 1: %p\n", arrays + 1);
    printf("&arrays + 1: %p\n", &arrays + 1);
    return 0;
}

输出会看到两者的差值是12字节,而非4字节,这直接体现了类型的区别。

数组与指针的核心差异

  • 数组是一块连续的内存空间,有固定大小(sizeof(arrays)可获取整个数组的字节数)
  • 指针是独立变量,存储的是内存地址,sizeof(指针)在64位系统通常为8字节,32位为4字节
  • 数组名不能被赋值(如arrays = another_arr;非法),但指针可以重新指向其他地址

内容的提问来源于stack exchange,提问作者bob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:50:23