直接用指针访问数组首地址可修改值,因数组名通常退化为指向首元素的指针;但需确保指针类型匹配且下标在合法范围内,否则易越界或对齐错误。

直接用指针访问数组首地址就能改值
数组名在多数上下文中会退化为指向首元素的指针,所以 &arr[0]、arr、&arr(注意类型不同)都可用于获取起始地址。但真正要修改值,关键不是“怎么拿到指针”,而是“怎么安全地解引用并赋值”。
- 确保指针类型匹配:比如
int arr[5],就该用int*指针,别用void*或char*直接强转后写 —— 容易越界或字节对齐出错 - 下标偏移必须在合法范围内:用
ptr[i]时,i必须满足0 ;用 <code>*(ptr + i)也一样,编译器不会帮你检查 - 别把栈数组地址传给其他作用域长期持有:函数返回局部数组的指针,后续解引用就是未定义行为
修改动态分配数组时,记得指针本身可变但内存得手动管理
用 new 分配的数组,指针变量可以重新赋值,但原内存不会自动释放 —— 这是常见泄漏点。
-
int* ptr = new int[10];后,ptr[3] = 42;是安全的修改 - 如果接着写
ptr = new int[20];,之前那块 10 个int的内存就丢了,没调delete[] - 用
std::vector替代裸指针数组,能避免这类问题;但如果必须用指针,每次重分配前先delete[]原指针
const 修饰符决定你能不能改值,不是看它是不是指针
很多人以为 “指针” 就能改值,其实真正限制修改的是类型限定符。下面三者行为完全不同:
-
int* p = arr;→ 可以改*p,也可以改p(即指针本身) -
int* const p = arr;→ 可以改*p,但不能让p指向别处 -
const int* p = arr;或int const* p = arr;→ 不能改*p,但p可以移动
错误常出现在函数参数里:声明为 void func(const int* p),你在里面写 *p = 123; 会编译失败,不是语法错,是类型系统在拦你。
多维数组指针容易搞错类型,&arr 和 arr[0] 不是一回事
比如 int arr[3][4],arr 类型是 int[3][4],退化后是 int(*)[4](指向含 4 个 int 的数组的指针),而 &arr[0][0] 才是 int*。
- 想用
int*遍历整个二维数组:用int* p = &arr[0][0];,然后p[i]对应第i个元素(按行优先) - 想用指针数组模拟“动态二维”:
int** mat需要先分配行指针数组,再每行new int[cols],这时改值是mat[i][j] = x;,本质是两次解引用 - 别写
int* p = arr;—— 编译器通常报类型不匹配,因为arr不是int*
类型不匹配时,强制转换如 (int*)arr 能过编译,但语义已错,后续偏移计算全乱。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











