面试题答案
一键面试定义方式
- 数组名:数组定义时指定元素类型和数组大小,如
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
指向的数据进行操作。