编程语言 · 2023年 10月 28日 0

数组和指针

24 次浏览

虽然有单独的文章描述数组和指针,但二者的关系实在值得再写一篇文章。

编译器的视角

  • 常常看到书籍上这么写"C/C++数组的本质是指针",这没有问题。编译器看到数组名,也就是数组首地址,即数组第一个元素的指针。对于超过二维的X维数组,概念更多,不仅是第一个元素指针,也是X-1维数组的指针。
  • 数组的sizeof: 数组int arr[10]占用空间sizeof(arr)不是sizeof(int *), 因为编译器知道arr的大小,此时当做原始数组。
    • 对于VLA可变数组,编译器很聪明地根据外部传入的数组元素个数乘以每个元素大小, 例如int类型数组,rax寄存器是数组元素个数,左移2位指令 shl $0x2,%rax 获得整个数组大小。
  • 用extern指针形式引用数组:
    • 定义了数组变量int a[10], 外部文件引用它不能用extern int *a, 否则此处的a代表a[0], 而非数组a地址,这不是本意。不论是VS2019还是GCC, 都是这个结果。
    • 可以用extern int arr[]引用外部数组,这样才会符合预期。