用网站做淘客怎么做,简单php企业网站源码,适合发朋友圈的营销广告,网站建设维诺之星在C中#xff0c;指针是至关重要的组成部分。它是C语言最强大的功能之一#xff0c;也是最棘手的功能之一。 指针具有强大的能力#xff0c;其本质是协助程序员完成内存的直接操纵。
指针#xff1a;特定类型数据在内存中的存储地址#xff0c;即内存地址。 指针变量的定…在C中指针是至关重要的组成部分。它是C语言最强大的功能之一也是最棘手的功能之一。 指针具有强大的能力其本质是协助程序员完成内存的直接操纵。
指针特定类型数据在内存中的存储地址即内存地址。 指针变量的定义语法 先声明后赋值
变量类型 * 指针变量名; // 声明
指针变量名 内存地址值; // 赋值int num 10;
int * p; // 声明
p num; // 赋值
- 变量类型如上int表示指针内存地址指向的内存区域存放的是整型数据
- *符号有两种含义
- 声明时*p表示变量p是指针变量存的是内存地址
- 使用时*p表示取指针p执行内存区域的数据
- 符号表示取变量内存地址是一个取内存地址的单目操作符
野指针和空指针
野指针被声明但未初始化赋值的指针。这个指针会指向随机的内存空间可能导致未知问题。 int * p; // 声明指针分配了8字节空间, p是野指针因为未被赋值
*p 10; // 将10赋予指针p所指向的空间*p 10是向未知的、随机的4字节内存区域修改存储值为10 为避免野指针应养成良好的变成习惯及时初始化或将指针置为空指针更为安全
int * p NULL;
int * p nullptr;指针运算
int num 10;
int *p num;
cout p endl; // 结果0x20d1ff6e4;
cout p endl; // 结果0x20d1ff6e8指针进行加减运算的结果和指针指向内存区域的数据类型有关以加法为例
char 类型指针 1 地址1 字节
int 类型指针1 地址4字节
double 类型指针1 地址8 字节
指针运算
数组对象本身记录的是内存地址第一个元素地址 可以通过指针运算完成使用指针存取数组元素。
int v[] {1, 2, 3, 4, 5};
int *p v;
*p 11; // 赋值数组第一个元素
*(p1) 22; // 赋值数组第二个元素
*(p2) 33; // 赋值数组第三个元素
cout *p endl; // 取数组第一个元素
cout *(p1) endl; // 取数组第二个元素
cout *(p2) endl; // 取数组第三个元素 动态内存分配
动态内存分配即由程序员手动的进行内存空间的分配、内存空间的释放等内存管理操作。
C代码中变量、数组等对象的创建是由C自动分配内存的称之为自动静态内存分配。
自动静态内存管理是不会进行内存空间的自动清理的。无垃圾回收机制 我们需要手动的管理内存即手动分配用完清理。
手动管理方式
new运算符申请空间提供该空间的指针地址
delete运算符申请的空间仅用于new申请的空间
建议写完new后立刻写delete然后再写业务逻辑代码
int * p new int; // 申请int类型4字节空间
int * p new double; // 申请double类型8字节空间
delete p; // 删除申请的空间
int * p new int[5]; // 申请5元素int数组空间
delete[] p; // 删除申请的5元素数组空间优势 手动控制内存避免内存空间浪费
劣势 考验程序员水平用的好效率高用不好有反效果
new
new运算符用于申请并分配内存空间 并提供指向该空间的指针内存地址 基本语法
new type 申请普通变量空间
new type[n] 申请数组空间
delete
delete运算符用于释放内存 仅可用于new运算符申请的内存区域
基本语法
delete 指针 删除普通变量空间
delete[] 指针 删除数组空间
数组元素的插入举例
#include iostream
using namespace std;/* 在下标1和3插入数字11和66 */int main()
{// 示例数组int * pArr new int[5] {1, 3, 5, 7, 9};// 创建新数组int * pNewArr new int[7];// 循环新数组挨个进行元素填充非插入的位置填充老数组元素插入位置填充新元素int offset 0; // 偏移量用来控制新老数组元素的下标对照for (int i 0; i 7; i){if (i 1){// 走到了下标1应当执行新元素插入pNewArr[i] 11;offset; // 每插入一个新元素offset1continue;} else if (i 3){// 走到了下标3应当执行新元素插入pNewArr[i] 66;offset; // 每插入一个新元素offset1continue;}// 不是插入位置从老数组中提取元素放入新数组中// 公式老数组的元素下标 offset 新数组元素下标// 当前循环的i是新数组的元素下标pNewArr[i] pArr[i-offset];}// 收尾工作delete[] pArr;pArr pNewArr;// 将新数组的内容输出for (int i 0; i 7; i){cout pNewArr[i] ,;}return 0;
}数组元素的删除举例
#include iostream
using namespace std;int main()
{// 示例数组int * pArr new int[5] {1, 3, 5, 7, 9};// 创建一个新的数组将需要保留的复制到新数组中int * pNewArr new int[4];// 循环去遍历老的数组将需要的元素放入新数组中不要的要跳过for (int i 0; i 5; i){if (i 2){continue;}if (i 2){pNewArr[i-1] pArr[i];}else{pNewArr[i] pArr[i];}}// 可选delete[] pArr; // 回收老数组的空间可选根据需要来说// 可选pArr pNewArr; // 将老数组的指针指向新数组的内存空间可选根据需要for (int i 0; i 4; i){cout 新数组的元素是 pNewArr[i] endl;cout 新数组的元素是 pArr[i] endl;}return 0;
}
指针悬挂
指针指向区域已经被回收(delete)这种问题称之为指针悬挂。 不要轻易进行指针之间相互赋值
delete回收空间前确保此空间100%不再被使用
错误示范
int main()
{ int * p1 new int;int * p2 p1; // 将p1赋值给p2*p1 10; delete p1;cout p2指针记录的是 *p2 endl;return 0;
}
const指针
const是C关键字被译为常量const指针即表示常量指针。
const用来修饰常量不可更改可以配合指针使用 以int为例。
const int * p; 指向常量的指针即存储值不可变但指针可修改指向
int * const p 地址; 常量指针
存储的值可以变 指着不可修改指向 必须初始化指针的地址
const int * const p 地址; 指向常量的常量指针
存储的值和指针的指向均不可修改