当前位置: 首页 > news >正文

指针基础知识总结

1.指针的定义与基本使用

(1)指针的定义:指针是存储变量内存地址的变量(地址值是常量)

(2)运算符:*(解引用) &(取地址)

(3)语法格式:数据类型* 指针变量名;

int *p;//定义int类型的指针变量p(1) int val=10;//定义int类型变量val p=&val;//取val的地址并赋值给p(即让p指向val)(2) int *p=&val //或将上述语句(1)(2)合并为int *p=&val,定义指针p并让其指向val *p=1;//解引用p,修改其指向的val的值,此时val=1
typedef int* Pint; Pint p,q;//定义指针p和q #define Pint int* Pint p,q;//定义指针p与整形变量q

注意:(1)指针类型与指向的变量类型一致

(2)禁止对野指针、空指针(NULL)进行解引用

int* p=NULL; *p=5;//错误,无法对空指针进行解引用 int* p; *p=1;//错误,无法对野指针进行解引用

(3)指针大小只与平台有关(32位系统占4字节,64位系统占8字节)

2.const变量及其定义

(1)定义:const修饰的变量表示只读且不可修改

(2)基本格式:const 数据类型 变量名=初始值;

const int* p=&val; const define PI=3.14; PI=3.24; //错误,无法对const修饰的常变量的值进行修改

注意:(1)必须初始化

(2)在c语言中,常变量更侧重于其变量的特点,而在c++中侧重于其常量的特点

const int n=10; int arr[n]; //在c语言中错误,在c++中正确

3.const与指针的结合使用

(1)const int* p:指向const int类型的指针,指针的指向可以改,但指向的值不能改(const修饰*p,即*p具有常性)

(2)int* const p:指向const类型的指针,指针的指向不能改,但指向的值可以改(const修饰p,即p具有常性)

(3)const int* const p:常量指针指向常量,指针的指向不能改,但指向的值也不能改(const修饰p与*p,即p与*p均具有常性)

int b = 1; const int *ptr1 = &b;//指向常量的指针 *ptr1 = 2; //错误:不能通过ptr1修改值 ptr1 = &a;//正确:可以修改其指向 int *const ptr2 = &b; //常量指针 *ptr2 = 2; //允许:可以修改其指向的值 ptr2 = &a; //错误:不能修改指针 const int *const ptr3 = &a; //指向常量的常量指针 *ptr3 = 50; //错误:不可修改其值 ptr3 = &b; //错误:不可修改其指向

注意:(1)权限可以缩小,但不允许放大

const int val=1; int* p=&val;//错误,权限放大 const int* p=&val;//正确

eg:

(1)int val=10;

int *p=&val; //正确,p(int类型一级指针)指向val(int变量),类型匹配
const int* p=&val; //同上,并将val的值进行固定(可将p的指向进行修改但不可通过*p赋值)
int* const p=&val; //同(1),并将p的指向固定为val(可通过*p修改val的值)
const int* const p=&val; //同(1),p的指向固定为val且将val的值进行固定

(2)const int val=10;

int *p=&val; //错误,val是const只读变量,但int* p是普通指针,权限放大
const int* p=&val; //正确,类型匹配,指针指向const int类型
int* const p=&val; //错误,val是const只读变量,权限放大
const int* const p=&val; //正确,类型匹配

4.指针的级数

(1)定义:n级指针存储(n-1)级指针的地址,可通过*访问变量值

(2)基本格式:数据类型 *(n级指针即有n个*)变量名

int val=1; int* p=&val;//一级指针 int** q=&p;//二级指针 int*** s=&q;//三级指针

eg:

int *p=val;//一级指针 int **q=&p;//二级指针 //通过q修改val的值,q的类型是int**,*q是对q进行一次解引用,类型与p一样(即为int*),**q是对q进行两次解引用,类型与val一样(即为int)

5.指针的运算

(1)定义:

int* p=arr;//正确 int* p=&arr[0];//正确

(2)指针的偏移

p+n:从p所指的位置开始,向高地址的偏移量=n*sizeof(*p)

注意:(1)p+n即保存此处的低地址

(2)*(p+n)即访问数组的第n+1个元素

(3)指针之间的运算(前提为指向同一块连续内存区域)

int* p=arr; int* q=arr+3; //p-q得到的是两指针相差的元素个数
int arr[5]; int* p=arr; //*(p+1)<=>p[1]<=>arr[1]

注:(1)用int等定义一个指向长度为5的数组的指针p时,若想使p+1的偏移量是整个数组的大小(即为5),有如下做法:

int arr[5]; int* p=&arr; int(*p)[5]=&arr;

(2)如若想通过指针p修改第四个元素的值,有如下两种做法:

int* q=(int*)p; *(q+3)=6;//方法一 *((int*)(p+1)-2)=6;//方法二

6.字符串常量

(1)不允许修改字符串中任意字符元素

(2)内存存储位置:数据区.data

(3)

const char* p="hello";//指针指向字符串常量

7.函数与指针

(1)在进行函数封装时,要尽量避免值传递,以节省内存

eg:

void Show(int* arr,int len){ }

(2)可以通过指针修改指针所指元素的值

(3)函数中如果想要通过形参的修改影响实参:传递实参的地址,在函数中用形参对其接收并进行解引用,从而修改实参的值

void Operate1(int a, int b,int*sum,int*mul){}//解引用 int main() {Operate(a,b,&s,&m);//传递地址}

8.数组指针与指针数组

(1)数组指针:一个指向数组的指针

int arr[3]={1,2,3}; int (*p)[3];//一个指向包含三个int元素的数组的指针 p=&arr;

(2)指针数组:一个元素为指针的数组

int a=1,b=2,c=3; int* arr[3]; arr[0]=&a; arr[1]=&b; arr[2]=&c;

9.指针函数与函数指针

(1)指针函数:返回值是指针的函数(不能返回局部变量的地址)

int* Search(int* arr,int len,int val){}

(2)函数指针:指向一个函数的指针

int add(int a,int b) { return a+b; } int main() { int (*p)(int,int);//定义函数指针的格式为:返回值类型 (*指针名)(参数类型列表) p=add;//指针指向目标函数 int result1=p(3,5);//写法1 int result2=(*p)(3,5);//写法2 }

当然我们也可以用typedef对类型进行重命名:

typrdef const int* pintc const int* p=arr; pintc p=arr;

注意:

typedef unsigned long long (*PArr)[3]; unsigned long long (*p)[3]=&arr; PArr p=&arr;
http://www.jsqmd.com/news/459462/

相关文章:

  • 为什么你始终看不懂JavaScript?
  • vue3:最新实现腾讯人脸核身+增强版人脸核身使用方法及示例源码,Vue3如何使用腾讯云慧眼人脸核身,提供人脸核身案例、身份信息核验、活体检测与核身比对等示例代码(后端spring与thinkphp)
  • Cursor 生死存亡:AI 编程痛点解决效率提升实战
  • LiuJuan Z-Image Generator实战案例:跨境电商独立站产品模特图生成SOP
  • Kdevelop使用步骤详解(Linux)
  • vue3:解决天地图api调用报403(Forbidden)错误,调用天地图服务出现403错误(或者部署到服务器后天地图API接口返回403详细排查和解决方法)彻底解决天地图403 Forbidden
  • Qwen3-0.6B-FP8详细步骤:Web界面主题定制+Logo替换与品牌化部署
  • 2026年知名的锦纶面料品牌推荐:coolmax面料/阳离子面料/石墨烯面料厂家最新推荐 - 行业平台推荐
  • 百川2-13B-4bits开源镜像部署案例:教育机构用作AI助教,支持学生编程答疑
  • (第二篇)Spring AI 实战进阶:从 0 搭建 SaaS 模式多租户 AI 客服平台(核心难点 + 性能优化全解析)
  • 部署完OpenClaw不能随时用!郁闷不?cpolar能解锁N种随身玩法!
  • [React Native for OpenHarmony] 将代码提交至AtomGit平台自建公开仓库用于分布式管理
  • PETRV2-BEV训练效果惊艳:BEV检测结果叠加原始环视图像的精准对齐展示
  • 【FacePoison+】Hiding Faces in Plain Sight: Defending DeepFakes by Disrupting Face Detection
  • Bidili Generator保姆级教程:解决SDXL显存高、LoRA不兼容痛点
  • ROS2(服务,launch,工具,仿真)
  • Comsol 探索光子晶体谷霍尔效应:从单胞、超胞到谷单向传输
  • GPEN推荐配置标准:8GB以上显存实现流畅批量处理
  • 重邮虚拟机环境配置(二)如何在本机和虚拟机之间的文件传输
  • Gemma-3-12B-IT入门指南:首次加载模型耗时优化与缓存机制说明
  • Gemma-3-12B-IT WebUI部署教程(含Supervisord管理):生产环境就绪
  • Qwen-Image-Edit-2509与SDXL对比:图像编辑灵活性实战评测
  • 重邮虚拟机环境配置(三)如何在虚拟机上安装驱动
  • Neeshck-Z-lmage_LYX_v2应用场景:短视频封面图批量生成+风格统一控制方案
  • Z-Image-GGUF内容创作:短视频脚本→分镜图→动态视频的AI协同路径
  • BUUCTF 后门查杀1
  • MYSQL个人笔记总结
  • Sonic数字人如何集成ComfyUI?可视化工作流导入步骤详解
  • 2026年比较好的深圳ETFE太阳能光伏板厂家推荐:深圳玻璃太阳能光伏板/深圳非标定制太阳能光伏板高评价厂家推荐 - 行业平台推荐
  • Wan2.2-T2V-A5B开发手册:自定义工作流创建与保存技巧