MST

星途 面试题库

面试题:C语言中数组名与指针的区别与联系

在C语言中,数组名在很多情况下可以当作指针来使用,但它们实际上并不完全相同。请详细阐述数组名和指针在以下方面的区别与联系:定义方式、内存分配、自增操作、作为函数参数传递时的表现。
14.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

定义方式

  • 数组名:数组定义时指定元素类型和数组大小,如 int arr[5];,这里 arr 是数组名,代表一块连续内存空间,存储5个 int 类型元素。
  • 指针:指针定义时指定所指向数据类型,如 int *ptr;ptr 是一个指针,可指向 int 类型数据,但此时它的值未初始化。

内存分配

  • 数组名:数组内存分配是在定义时静态分配(在栈上,除非是静态数组或全局数组),内存大小根据数组元素类型和数量确定。例如 int arr[5]; 分配了 5 * sizeof(int) 字节连续内存。
  • 指针:指针本身占用固定大小内存(32位系统通常4字节,64位系统通常8字节),用于存储所指向对象的地址。指针所指向的数据内存分配需通过动态分配函数(如 malloc)或指向已存在变量。如 int *ptr = (int *)malloc(5 * sizeof(int)); 为指针 ptr 动态分配了可存储5个 int 类型数据的内存。

自增操作

  • 数组名:数组名是常量指针,其指向的内存地址在数组生命周期内固定,不能对数组名进行自增操作,如 arr++; 会编译错误。
  • 指针:指针变量可以进行自增操作,自增后指针指向下一个同类型数据位置。例如 int *ptr; int arr[5]; ptr = arr; ptr++;ptr 原本指向 arr[0],自增后指向 arr[1],移动的字节数为所指向数据类型大小(这里 int 类型通常4字节)。

作为函数参数传递时的表现

  • 数组名:当数组名作为函数参数传递时,会退化为指针。例如函数 void func(int arr[]) 等价于 void func(int *arr)。在函数内部无法通过传递进来的数组名获取数组真实大小,需额外参数传递数组大小,如 void func(int *arr, int size)
  • 指针:指针作为函数参数传递,和数组名作为参数类似,都是传递指针值(地址)。函数可以操作指针所指向的数据,但同样不能通过指针本身获取其所指向数组的大小,也需额外信息。如 void func(int *ptr, int size),函数内可以对 ptr 指向的数据进行操作。