最绚丽的星星-指针
发布时间:2026/10/14 1:39:52 锦皓数字建站

前言如果觉得文章对你有帮助的话请点赞收藏关注支持一下博主如有不足请指点我及时改正一起加油我们知道内存是按字节排列的内存空间每个字节有一个编号称为“地址”程序用到的数据和声明的变量就存放在这一个个字节中不同类型的数据和变量占用的字节数不同。习惯上将某个变量占用的几个字节称为内存单元。通过变量名可以访问该变量对应的内存单元实际上我们也可以直接通过地址来访问某个内存单元。我认为这个解释很形象这里就直接粘过来用了嘿嘿1.声明一个指针变量指针和intfloat一样也是一种数据类型。基于该数据类型声明的变量称为指针变量。而“区别于“int这种数据类型存储的是数值指针变量存储的是内存中的某个地址。和普通的变量一样在使用指针变量之前应先对指针变量进行声明。类型* 指针变量名; //如 int* p;//说明写成int* p;或int *p;都是可以的*跟着谁都行*在这里表明这是一个指针变量类型指定了指针所指的内存单元的数据类型。注意⭐int* p1, p2;//声明了一个指针变量p1和int型变量p2一次性声明多个指针变量时每个指针变量名前都要加*例 int* p1,*p2; //这样才是声明了两个指针变量p1p2下面我们来看一个程序。#include iostream using namespace std; int main() { double num 3; double* pNum; pNum num; cout pNum在内存中的地址是 pNum endl; cout pNUm的值为 pNum endl; cout num在内存中的地址为 num endl; cout 使用指针访问num *pNum endl; cout pNum指针类型在内存中的字节数 sizeof(pNum) endl; cout numdouble型在内存中的字节数 sizeof(num) endl; return 0; }可能你会有疑问这里指针的数据类型不是double型吗怎么占用4个字节答指针变量存储的内容是内存中某个字节的地址指针变量占用的内存字节数随系统的不同有所不同在普通的Windows32平台上指针变量占4个字节但在其他一些内存模型中指针变量可能占用 两个字节简单地说指针变量占用的字节多少取决于程序的内存空间有多大。如下图代码解析1.double num3;声明了一个double型变量num并对其赋初值为3编译器将在内存中开辟一块8个字节的区域将num和这8个字节关联起来并将这8个字节初始化为3。2.double* pNum声明了一个指向double类型的指针编译器将在内存中开辟一块4个字节的内存区域并将其和pNum关联起来3.pNum num;是对指针变量的赋值是取地址运算符意思就是将num这个变量的地址赋值给pNum变量(指针变量存储的是地址呀)4.⭐可通过指针变量名对指针所指向的内存单元来进行访问 这里的可不是之前发挥的 表明 这是一个指针的作用了而是要理解为间接引用符也就是我们说的解指针 这里对*pNum的访问和通过变量名(num)对该内存单元的访问实际是一样的都是对005DFC58-005DFC5F这8个字节进行访问。见下图。2.初始化指针变量⭐野指针是大坑使用指针前必须初始化!!未初始化的指针是什么当你仅仅声明指针变量却不给它赋值的时候C不会自动帮你初始化。 指针变量里会存内存里残留的随机地址这种指针我们叫野指针。野指针会随便指向一块未知内存如果直接用*去访问它指向的内容程序行为完全不可预测大概率直接崩溃属于非常危险的操作。代码演示如下#include iostream using namespace std; int main() { int *p; // 只声明指针没有初始化p里面是内存随机垃圾值野指针 *p 100; // 致命错误解引用野指针向未知内存写数据 return 0; }2.正确初始化指针声明时直接绑定变量地址。通过取地址符给指针变量赋值是个有效的手段实际上可以在声明一个指针变量的同时完成其 初始化。int num1; // 先开辟一块内存存放整数1int* pnum;// 定义int类型指针p把num的地址存入p代码如下1声明同时初始化#include iostream using namespace std; int main() { int num 1; int* pN num; // 定义指针同时绑定num的地址 *pN 100; // 修改pN指向的num变量的值 cout num endl; // 输出100 return 0; }2暂时不知道指向谁 → 初始化为空指针#include iostream using namespace std; int main() { int* p NULL; // 空指针明确表示不指向任何有效内存 // *p 200; // 禁止空指针也不能直接解引用依然会崩溃。空指针不等于安全指针奥 return 0; }3.一条铁则使用间接引用*之前指针必须有合法指向在你打算用*指针去读写内存前一定要保证指针已经初始化指向一块合法有效的内存。如果暂时不知道这个指针要指向谁不要放任它变成野指针手动赋值为空指针NULL值等价于 0代表 “无处可指”。int* p NULL; // 空指针不指向任何有效内存3.指向指针的指针(二级指针)指针本身也是变量变量就有内存地址。既然有地址我们就可以用另一个指针保存这个地址这就是二级指针。声明格式基础类型 **变量名.普通一级指针类型*存放普通变量的地址。二级指针类型**存放一级指针变量的地址。double num; // 普通double变量double* pN num; // 一级指针pN存放num的地址double** ppN pN; // 二级指针ppN存放一级指针pN的地址代码演示如下#include iostream using namespace std; int main() { double num 3.14; double* pN num; // 一级指针指向num double** ppN pN; // 二级指针指向一级指针pN cout num的值 num endl; cout num的地址 num endl; cout pN的值存放num地址 pN endl; cout pN自身的地址 pN endl; cout ppN的值存放pN的地址 ppN endl; // 解引用 cout *pN *pN endl; // 取pN指向内容就是num的值 cout **ppN **ppN endl;// 对二级指针两次解引用最终拿到num的值 return 0; }*ppN对二级指针解一层引用拿到一级指针 pN等价 pN**ppN连续两层解引用顺着ppN→pN→num拿到最终变量 num 的数据易错提醒double** ppN pN;// ❌ 错误写法 double** ppN num;// ppN 是 double** 类型只能接收 double* 类型变量的地址不能直接存普通变量num的地址类型必须匹配double*只能保存double变量地址double**只能保存double*一级指针变量地址总结希望可以帮助到大家感谢观看下篇讲解指针赋值指针运算动态内存的问题想看的小伙伴码住嘻嘻
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。