指针基础
尽管指针变量内记录的是内存地址,但仍可以进行基础的数学计算。
指针运算是对指针的基础型操作,非常适合操纵数组并配合做动态内存分配。
指针进行加减运算的结果,和指针指向内存区域的数据类型有关,以加法为例:
•char 类型指针 +1, 地址+1 (字节)
•int 类型指针+1, 地址+4(字节)
•double 类型指针+1, 地址+8 (字节)
•…
•指针+n或-n,即内存地址 +n * 类型大小 或 –n * 类型大小
int num = 10;
int* p = #
cout<< p <<endl; //0x10d2ff7e4
p++;
cout<< p <<endl; //0x10d2ff7e8
指针可以进行加减运算,即+、-、++、-- 每次加减n,是对内存地址进行 n * 类型大小 的加减
数组对象本身记录的是内存地址(第一个元素地址)可以通过指针运算,完成使用指针存取数组元素
int v[] = {1, 2, 3, 4, 5};
int *p = v;
*p = 11; // 赋值数组第一个元素
*(p+1) = 22; // 赋值数组第二个元素
*(p+2) = 33; // 赋值数组第三个元素
cout << *p << endl; // 取数组第一个元素
cout << *(p+1) << endl; // 取数组第二个元素
cout << *(p+2) << endl; // 取数组第三个元素
指针运算,简单来说就是对地址的一种计算操作,但仍有一些细节点需要注意,避免出现问题:
•
求两指针的中间指针(中间地址)
•对于指针p,p++ 和 p+1的区别
动态内存分配
动态内存分配:即由程序员手动的进行内存空间的分配、内存空间的释放等内存管理操作。
•
整型变量num和整型数组nums,在使用后,后续的程序中没有任何作用了。
•所以num和nums会一直占用内存空间。
(自动)静态内存分配
C++代码中,变量、数组等对象的创建,是由C++自动分配内存的,称之为(自动)静态内存分配。
(自动)静态内存管理,是不会进行内存空间的自动清理的。(无垃圾回收机制)我们需要手动的管理内存,即手动分配,用完清理。
传统方式创建普通变量或数组,其内存由C++自动管理,称之为:静态内存管理
•静态内存管理,不会清理用不到的内存空间
动态内存管理
•动态内存管理:程序员手动管理内存空间
手动管理方式:
•new运算符申请空间,提供该空间的指针(地址)
int* p = new int;
int* p1 = new double;
delete p;
delete p1;
•delete运算符申请的空间,仅用于new申请的空间
int* p = new int[5];
delete[] p;
建议:写完new后,立刻写delete,然后再写业务逻辑代码
优势:手动控制内存,避免内存空间浪费
劣势:考验程序员水平,用的好效率高,用不好有反效果