MST
星途 面试题库

面试题:C语言一维数组名与指针在内存布局下的差异与联系

已知C语言中有一个一维数组`int arr[5] = {1, 2, 3, 4, 5};`,以及一个指针`int *ptr = arr;`。请详细分析`arr`和`ptr`在内存中的布局情况,包括它们各自所指向的内存起始地址、占用内存空间大小以及在不同运算(如`arr + 1`和`ptr + 1`)下的行为差异。同时,阐述为什么在某些情况下`arr`和`ptr`看似行为一致,而在另一些情况下却有明显区别。
46.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 内存起始地址
    • arrarr是数组名,它代表数组的首地址,即&arr[0]。在内存中,数组元素是连续存储的,arr指向数组第一个元素1的内存地址。
    • ptrptr是一个指针变量,它被初始化为arr,所以ptr也指向数组第一个元素1的内存地址,即ptr == arr
  2. 占用内存空间大小
    • arr:数组arr占用的内存空间大小为sizeof(arr),由于每个int类型在常见系统中占4字节,arr包含5个元素,所以sizeof(arr)=5 * sizeof(int)=20字节。
    • ptrptr是一个指针变量,在32位系统中,指针通常占4字节,在64位系统中,指针通常占8字节,即sizeof(ptr)在32位系统为4字节,64位系统为8字节。
  3. 运算行为差异
    • arr + 1arr是数组名,当进行arr + 1运算时,它根据数组元素类型(int)的大小进行偏移。因为int类型占4字节,所以arr + 1指向数组第二个元素2的内存地址,即&arr[1],偏移量为1 * sizeof(int)
    • ptr + 1ptr是指针变量,ptr + 1同样根据指针所指向的数据类型(int)的大小进行偏移。所以ptr + 1也指向数组第二个元素2的内存地址,即&arr[1],偏移量为1 * sizeof(int)
  4. 行为一致与区别
    • 行为一致:在进行指针运算(如arr + 1ptr + 1)时,它们看似行为一致,因为它们都指向数组的下一个元素。这是因为在C语言中,数组名在大多数表达式中会自动转换为指向数组首元素的指针,所以在指针运算这种场景下,arrptr表现相似。
    • 行为区别:然而,在某些情况下它们有明显区别。例如,sizeof(arr)返回整个数组占用的内存大小(20字节),而sizeof(ptr)返回指针变量本身占用的内存大小(32位系统4字节,64位系统8字节)。另外,arr是数组名,是一个常量指针,不能被赋值修改(如arr = &some_other_int;是错误的),而ptr是一个变量指针,可以被重新赋值(如ptr = &some_other_int;是合法的)。