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