目录
基本概念
-
数组:
是一块连续的内存空间,存储相同类型的元素。声明时需指定大小(如int arr[5]
),通过索引访问元素(arr[2]
)。数组名是首元素的地址,但类型为指向元素的指针常量(如int *const
)。 -
指针:
是存储内存地址的变量(如int *p
),可指向任何同类型数据(包括数组元素)。指针的值(地址)可以修改,支持算术运算(如p++
)。
内存分配
数组
- 静态分配(栈/全局区):声明时大小固定,如 int arr[10]。
- 内存由编译器自动管理,生存期由作用域决定。
指针
- 通常指向动态内存(堆):需手动分配和释放(如 `malloc`/`free`)。
- 也可指向栈内存或全局变量(如 `int *p = &x`)。
核心区别
共同点
1.访问元素:均可通过指针算术访问元素(如 arr[i] 等价于 *(arr + i))。
2.函数参数:数组作为参数时,实际传递的是指针(如 void func(int arr[])`等价于 void func(int *arr))。
常见误区
1.数组名不是指针变量:arr++`非法,因为数组名是常量;p++`合法(若 p是指针变量)。
2.字符串常量:
- char s[] = "abc"; 在栈中创建可修改的副本。
- char *p = "abc";指向只读常量区,修改p[0]导致未定义行为。
总结
数组:需固定大小的数据集合(如存储已知数量的传感器数据)。
指针:动态数据结构(如链表、树)、函数间传递大数据(避免拷贝)、灵活内存管理。
数组和指针在语法上相似,但本质不同:
- 数组是内存容器,指针是地址的引用。
- 理解它们的差异有助于避免内存错误(如越界访问、未初始化指针),并提升代码效率。