指针和数组在C语言中有哪些关键区别?
核心区别:
-
内存分配
- 数组在栈或静态存储区分配连续内存空间
- 指针只是一个变量,存储地址信息,可指向任意内存位置
-
sizeof 运算符
cint arr[10]; int *ptr = arr; sizeof(arr); // 返回 40 (10 * sizeof(int)) sizeof(ptr); // 返回 8 (64位系统指针大小) -
赋值操作
- 数组名不能被赋值,是常量地址
- 指针可以被重新赋值指向不同地址
-
运算符优先级
- 数组下标
[]优先级高于解引用* *ptr++先取值再递增指针(*ptr)++递增指针指向的值
- 数组下标
-
参数传递
- 数组作为参数传递时退化为指针
- 函数内无法获取数组实际大小
常见陷阱:
- 混淆
&arr和arr的类型差异 - 误用指针算术导致越界访问
- 忘记数组名在表达式中退化为指针的特性