指针类型参数提供了一种灵活而高效的方式来处理数据结构、内存管理和函数调用,使得程序更加高效、可维护和可扩展。然而,指针操作也需要谨慎使用,以避免潜在的内存泄漏和错误。
了解指针
指针与常规类型变量一样,只不过一般变量的值是显式的值(例如:一个整数5、一个字符串”nice");而指针类型变量的值是一个地址,同时指针也占有一个内存。
声明一个指针
int age = 20;
int *pointInt = &age; // 声明并初始化指针,指向age变量
//-- 访问指针指向的值
cout << *pointInt << endl; // * 解引用运算符
动态内存分配
在C++中,动态内存分配是通过
new
和delete
操作符来实现的。动态内存分配允许在程序运行时分配内存,使得程序执行更加灵活。而静态内存分配,是一种在程序执行前就确定分配好内存空间的方式。在静态内存分配中,内存空间在程序编译时就被分配好了,程序运行时不会动态地分配或释放内存。这种方式通常用于全局变量、静态变量以及常量等的存储。
int *ptr = new int(5); // 使用 new 分配成功后返回一个指向内存的指针;
delete ptr; // 释放内存
-
内存泄露
分配后的内存未被及时释放,减少了系统可用的内存量,降低程序的执行速度;
-
内存池
自由存储区表现为一个内存池,是一种内存抽象,程序可以分配、释放其中内存;
指针的 ++ / - -
-
执行后,指向相邻同类型的值,并非相邻的字节;
// -- 执行过程 (Type)指针 +/- sizeof(Type) ==>> 下/上一个同类型的值
const 用于指针
// -- 地址常量
int *const point = &age;
// -- 数据常量
const int * point = &age;
// -- 地址、数据均常量
const int *const point = &age;
指针传递给函数
-
指针类型参数的好处
- 直接访问和修改内存中的数据,不需要进行复制; - 更灵活的操作数据结构;
-
注意
尽量使用 const 确保函数不会修改特定的参数值;
-
缺点
指针可能无效,因此使用时要检查有效性,避免非法访问导致程序崩溃;
数组与指针
数组类似于固定内存范围内发挥作用的指针
/* 数组和指针可以分别使用对方的访问方式 */
int myArray[19] = { . . . }; // *(myArray + i)进行访问
int *pointA = myArray; // point[i] 访问
总结
- 务必将指针初始化为有效地址 / NULL;
- 务必在指针有效时才使用它;
- new 分配内存后记得 delete 释放,并且释放后不要再访问它;
- 不要对同一个内存地址 delete 多次;