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

(C语言)指针详解与应用

指针是C语言的灵魂指针与底层硬件联系紧密使用指针可操作数据的地址实现数据的间接访问。指针即指针变量用于存放其他数据单元如变量、数组、结构体和函数的首地址。若指针存放了某个数据单元的首地址则这个指针指向了这个数据单元若指针存放的值为0则这个指针为空指针。指针原理指针占用的内存空间在32位操作系统下占用4个字节空间 在64位操作系统下占用8个字节int main(){cout sizeof(int *) sizeof(int*) endl;cout sizeof(char *) sizeof(char*) endl;cout sizeof(double *) sizeof(double*) endl;cout sizeof(float *) sizeof(float*) endl;return 0;}结果我是64位操作系统所以4个输出都为8如何定义指针char* p、short* p、int* p等其中*号只是一个标识就是告诉计算机我要定义一个指针了它与数据类型是一个整体其中p为指针变量存放的是数据单元的首地址。指针的操作int *p;//定义一个指针内存分配int *arr (int*)malloc(10 * sizeof(int)); // 分配10个int空间free(arr);//释放内存与malloc是一对arr NULL;//防止指针悬空则对指针p有如下的操作方式p a;//取地址将数据a的首地址赋值给pint b *p;//取内容即将p指向的地址里的数据给b就是将a的值赋给b数据类型要一致char *p a;//意思就是我定义一个指针p并存放a的首地址p;//使指针向下移动一个数据宽度p同理p--;//使指针向上移动一个数据宽度--p同理p和--p错用可能导致越界一般用于数组关于*号的区分若是在数据类型的后面如int *p*号就是一个标识符告诉计算机我要定义指针无运算若是a *p,那么这里的*号就是取内容若是a*b,那么这里的*就是乘号空指针和野指针空指针1、指针变量指向内存中编号为0的空间2、用途初始化指针变量注空指针指向的内存不可以直接访问3、得到空指针的方式int *ptr nullptr;//最直接最简单int *ptr 0;int *ptr NULL;//#include cstdlib注意一定要初始化所有的指针。未初始化的指针是造成运行错误的一大原因访问未被初始化的指针相当于去访问一个本不存在的位置上的本不存在的对象。如果指针所指向的空间恰好有内容我们就很难分清它到底是合法的还是非法的了。所以建议初始化所有的指针尽量定义好对象之后在定义指向它的指针。实在不清楚的情况下就把指针初始化为nullptr。野指针指针变量指向非法的内存空间出现的原因1、指针变量未初始化2、指针释放后之后未置空3、指针操作超越变量作用域int main(){int *p (int*)0x1100;//0x1100是随便指向的编号而编号里的数无权操作因为未申请空间cout *p endl;return 0;}在程序中要避免出现野指针十分危险。总结空指针和野指针都不是我们申请的空间所以不要访问。const修饰指针const修饰指针有三种情况1、const修饰指针常量指针特点指针的指向可以修改但是指针指向的值不可以修改const int *p a*p 20;//错误指针指向的值不可以修改p b; //正确指针的指向可以修改2、const修饰常量指针常量特点指针的指向不可以改但是指针指向的值可以改int * const p a;*p 20;//正确指针指向的值可以修改p b;//错误指针的指向不可以修改3、const既修饰指针也修饰常量特点指针的指向和指针指向的值都不可以改const int * const p a;*p 20;//错误p b;//错误记忆技巧1、名称记忆将const翻译为中文”常量“” * “就叫指针const在前*在后就叫常量指针 const在后*在前就叫指针常量。2、可否修改记忆要明白const是起限定的作用int *const p中的const限定的是指针p而指针的是起到指向的作用所以p就不能指向了也就不能修改指向了const int *p中的const限定的是*而*的作用是取值所以*就不能取值了也就不能修改值了。数组与指针数组是一些相同数据类型的变量组成的集合其数组名即为指向该数组类型的指针简单理解就是数组名相当于指针变量里面存放的都是首地址。c[0] 等于 *c;c[1] 等于 *(c1)c[2] 等于 *(c2)遍历的方法1、用for循环遍历int *p arr; //arr是一个数组名for(int i 0;i 10;i ){cout p[i] endl;}2、用指针遍历for(int i 0;i 10;i ){cout *arr endl;arr ;}指针与函数本节主要讨论的是函数的参数采用指针的形式又叫地址传递。void swap(int *a,int *b) //地址传递{int temp *a;*a *b;*b temp;}int main(){int a 10;int b 20;swap(a,b);cout a a b b endl;return 0;}这是一个简单的交换值的程序这段代码改变了实参a和b的值总结如果不想修改实参就用值传递想修改实参就用地址传递。函数指针与指针函数主体是指针还是函数需求指针函数函数返回类型为指针函数指针指针指向一个函数首先要明白的优先级大于 *主要看fint* f(int x,int y): 因为的优先级大于 *所以首先主体是一个函数返回指针int (*f)(int x,int y): 首先f是一个指针指向一个函数格式为int (int x,int y)函数指针指向普通函数#include iostreamusing namespace std;int add(int a,int b){return ab;}int Minus(int a,int b){return a-b;}int main(){//定义一个函数指针int (*f)(int a,int b);f add;//将函数add的地址给函数指针cout a b (*f )(1,3) endl;f Minus;//将函数minus的地址给函数指针cout a - b (*f)(5,6) endl;return 0;}函数指针指向指针函数#include iostreamusing namespace std;int* add(int a,int b) //指针函数{int c ab;return c;}int* Minus(int a,int b) //指针函数{int c a-b;return c;}int main(){//定义一个函数指针int* (*f)(int a,int b);f add;//将函数add的地址给函数指针cout a b *(*f )(1,3) endl;f Minus;//将函数minus的地址给函数指针cout a - b *(*f)(5,6) endl;return 0;}总结1、指针函数依然是一个函数返回类型为指针比如int*、char*等2、而函数指针是一个指针它指向函数存放函数的地址函数地址与返回值地址一致3、函数指针的格式与要调用的函数格式保持一致注意事项在对指针取内容之前一定要确保指针指在了合法的位置否则将会导致程序出现不可预知的错误同级指针之间才能相互赋值跨级赋值会导致报错或警告指针的应用传递参数又叫地址传递1、使用指针传递大容量的参数主函数和子函数使用的是同一套数据避免了参数传递过程中的数据复制提高了运行效率减少了内存使用。#include stdio.hint FindMax(int *array,int count)//子函数找最大值的简单算法{int i;int max array[0];for(i 1;i count;i){if(array[i] max){max array[i];}}return max;}int main(){int a[] {1,5,7,2,3,4,15};int Max;Max FindMax(a,7);printf(Max %d,Max);}以上是一个找最大值的简单算法其中数组a的容量比较大可以通过指针传地址的方式减小空间的使用。若采用传地址的方式那么数据就可以在子函数里被改变而不是简单的复制。所以为了不让子函数随意的更改主函数的数据我们可以用const关键字。int FindMax(constint *array,int count) //const的运用{array[2] 66;//若这样写就会报警告或是报错不可以更改数组a里的数据只可以读}2、使用指针传递输出参数利用主函数和子函数使用同一套数据的特性实现数据等返回可实现多返回值函数的设计运用了地址传递。一般情况下C语言只能返回一个参数那如果我们想要返回多个参数怎么办呢#include stdio.h//子函数可以返回次数count与最大值max的值可以不需要returnint FindMax(int *max, int *count, const int *array, int length){*max array[0];for(int i 1;i length;i ){if(*max array[i]){*max array[i];(*count);}}}int main(){int a[] {1,5,7,2,3,4,15};int Max;int Count 0;FindMax(Max,Count,a,7);//将Max地址与Count的地址都传递给子函数printf(Max %d,Count %d,Max,Count);}这样我们就可以返回多个参数了。传递返回值将模块内的共有部分返回让主函数持有模块的“句柄”便于程序对指定对象的操作。#include stdio.h/*******************************************///假设这是一个模块里面的Time数据我们不能直接访问所以通过指针来进行间接访问int Time[] {23,50,55};//注意若是局部变量则出错int *GetTime(void){return Time;}/*******************************************///以上为一个模块int main(){int *pt;pt GetTime();printf(pt[0] %d\n,pt[0]);//pt[0] 23}直接访问物理地址下的数据访问硬件指定内存下的数据如设备ID号等。将复杂格式的数据转换为字节方便通信与存储。

相关文章:

(C语言)指针详解与应用

指针是C语言的灵魂,指针与底层硬件联系紧密,使用指针可操作数据的地址,实现数据的间接访问。指针即指针变量,用于存放其他数据单元,如变量、数组、结构体和函数的首地址。若指针存放了某个数据单元的首地址&#xff0c…...

从elm-react-native学习React Native最佳实践:10个关键开发技巧

从elm-react-native学习React Native最佳实践:10个关键开发技巧 【免费下载链接】elm-react-native A react native app simulating eleme app,run ios and android. 项目地址: https://gitcode.com/gh_mirrors/el/elm-react-native 想要快速掌握…...

10分钟掌握XGBoost:机器学习竞赛的终极梯度提升库

10分钟掌握XGBoost:机器学习竞赛的终极梯度提升库 【免费下载链接】xgboost Scalable, Portable and Distributed Gradient Boosting (GBDT, GBRT or GBM) Library, for Python, R, Java, Scala, C and more. Runs on single machine, Hadoop, Spark, Dask, Flink a…...

SeekStorm入门指南:5分钟构建你的第一个高性能搜索引擎

SeekStorm入门指南:5分钟构建你的第一个高性能搜索引擎 【免费下载链接】SeekStorm SeekStorm: vector & lexical search - in-process library & multi-tenancy server, in Rust. 项目地址: https://gitcode.com/gh_mirrors/se/SeekStorm 想要快速构…...

CANN/asc-devkit:__hltu函数文档

__hltu 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/can…...

CANN/asc-devkit浮点ilogbf函数文档

ilogbf 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/can…...

PS左边工具栏不见了?最全恢复解决教程

在使用Photoshop进行修图、设计操作时,左侧工具栏作为核心功能面板,承载着选区、绘画、修图等常用工具,一旦莫名消失,会直接中断操作、影响效率。很多新手遇到这种情况会手足无措,其实无需慌张,今天就给大家…...

PHP Intelephense项目结构解析:多工作区、虚拟工作区与远程开发

PHP Intelephense项目结构解析:多工作区、虚拟工作区与远程开发 【免费下载链接】vscode-intelephense PHP intellisense for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-intelephense PHP Intelephense是一款为Visual Studio …...

PS 图片模糊修复教程:4 种方法,一键变高清

在日常设计、摄影后期、电商运营等场景中,模糊图片往往会严重影响观感与使用效果——无论是拍摄时的对焦失误、低分辨率素材的压缩失真,还是老照片的模糊褪色,都需要快速恢复清晰度。本文整理4种超实用的图片清晰化方法,涵盖PS原生…...

article-extractor项目架构解析:模块化设计与可扩展性指南

article-extractor项目架构解析:模块化设计与可扩展性指南 【免费下载链接】article-extractor To extract main article from given URL with Node.js 项目地址: https://gitcode.com/gh_mirrors/ar/article-extractor article-extractor是一个强大的Node.j…...

洛圣都生存指南:YimMenu开源游戏增强工具与安全防护系统深度解析

洛圣都生存指南:YimMenu开源游戏增强工具与安全防护系统深度解析 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trendi…...

OpenClaw+Hermes +Vibe Coding本地部署|论文自动化|知识工作流

在人工智能快速重塑科研范式的背景下,大语言模型、Agent系统与自动化科研工作流,正在深刻改变文献阅读、代码开发、数据分析、论文写作与科研协作的底层方式。面对模型快速迭代、工具形态持续演进的新局面,科研人员亟需从“会使用AI”进一步升…...

SchemaCrawler:终极数据库模式发现与理解工具完全指南

SchemaCrawler:终极数据库模式发现与理解工具完全指南 【免费下载链接】SchemaCrawler Free database schema discovery and comprehension tool 项目地址: https://gitcode.com/gh_mirrors/sc/SchemaCrawler 在当今数据驱动的时代,数据库模式发现…...

No!! MeiryoUI终极指南:3步恢复Windows界面字体自定义功能

No!! MeiryoUI终极指南:3步恢复Windows界面字体自定义功能 【免费下载链接】noMeiryoUI No!! MeiryoUI is Windows system font setting tool on Windows 8.1/10/11. 项目地址: https://gitcode.com/gh_mirrors/no/noMeiryoUI 你是否曾经为Windows 8.1/10/11…...

OpenELB安全配置:RBAC、网络策略与证书管理最佳实践

OpenELB安全配置:RBAC、网络策略与证书管理最佳实践 【免费下载链接】openelb Load Balancer Implementation for Kubernetes in Bare-Metal, Edge, and Virtualization 项目地址: https://gitcode.com/gh_mirrors/op/openelb OpenELB是一款专为Kubernetes设…...

建筑数据驱动预测控制方法应用【附模型】

✨ 长期致力于建筑热动态、阻容模型、数据驱动预测控制、控制器实施、人工智能研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)简化阻容模型结构与贝叶…...

Zygo测试驱动开发实践:如何为解释器编写可靠的测试套件

Zygo测试驱动开发实践:如何为解释器编写可靠的测试套件 【免费下载链接】zygomys Zygo is a Lisp interpreter written in 100% Go. Central use case: dynamically compose Go struct trees in a zygo script, then invoke compiled Go functions on those trees. …...

Miro致力弥合AI潜力与组织现实之间的鸿沟

Miro在Canvas 26上将其AI平台建设成为现代AI生态系统的连接层 — 汇聚团队、智能体以及已经使用的工具,将个体AI生产率变为整个组织的转型 Miro是一个面向团队的人工智能(AI)创新工作空间。该公司宣布推出多项AI平台创新,强化了其…...

人工模仿智能在专业领域中的挣扎

原文:towardsdatascience.com/the-struggle-of-artificially-imitated-intelligence-in-specialist-domains-6e63a4e0ebfc?sourcecollection_archive---------4-----------------------#2024-05-08 为什么通向真正智能的道路要经过本体论和知识图谱 https://mediu…...

mob源码深度解析:Go语言实现高效Git协作工具的架构奥秘

mob源码深度解析:Go语言实现高效Git协作工具的架构奥秘 【免费下载链接】mob Tool for smooth git handover. 项目地址: https://gitcode.com/gh_mirrors/mo/mob 在团队协作开发中,Git代码交接常常成为效率瓶颈。mob作为一个用Go语言编写的Git协作…...

什么是换根DP及第一步操作说明

第一步 以任意一点统计我们规定任意一个点作为根 root,进行树形 DP 的操作。获取以确定 root 为根的状态下,所有子树的深度 deep[]。具体的,设当前 dfs 的点为 cur,孩子节点是 nex:对每个进入 dfs 的 deep[cur] 初始化…...

CMake基础:常用内部变量和环境变量的引用

目录 1.常用 CMake 变量 1.1.编译与构建控制 1.2.路径与目录变量 1.3.项目信息变量 1.4.系统与平台变量 1.5.工具链与交叉编译 1.6.测试与安装变量 1.7.高级编译选项 2.常用环境变量 2.1.编译器与工具链 2.2.依赖库路径 2.3.CMake 专用环境变量 2.4.系统环境变量P…...

ROCm rocr-libhsakmt分析系列3: aperture概念

前文 acquire_vm 讲了gpu vm的概念,gpu vm就是一个GPU虚拟地址空间。那么偌大的一个空间,我们该如何使用它呢?仍然可以类比进程的虚拟地址空间,例如,进程的虚拟地址空间按功能划分成了多个段:代码段、全局变量段、栈区、堆区、文件mmap区等,每个段占用互不相交的虚拟地址…...

Linux 文件隐藏属性 chattr、lsattr 详解——锁住文件防误删(运维必备)

前言很多人只知道 chmod、chown 改权限,却不知道 Linux 还有隐藏文件属性。普通权限能被 root 绕过,而 chattr 隐藏属性可以 锁住文件,root 也无法删除、修改,是服务器防护、防误删、保护配置文件的核心命令。一、命令简介lsattr&…...

mpv.net:Windows平台最强大的开源媒体播放器解决方案

mpv.net:Windows平台最强大的开源媒体播放器解决方案 【免费下载链接】mpv.net 🎞 mpv.net is a media player for Windows with a modern GUI. 项目地址: https://gitcode.com/gh_mirrors/mp/mpv.net 在Windows平台上寻找一款既强大又简洁的媒体…...

Octree-GS终极指南:如何用LOD结构化3D高斯实现实时大规模场景渲染

Octree-GS终极指南:如何用LOD结构化3D高斯实现实时大规模场景渲染 【免费下载链接】Octree-GS [TPAMI 2025] Octree-GS: Towards Consistent Real-time Rendering with LOD-Structured 3D Gaussians 项目地址: https://gitcode.com/GitHub_Trending/oc/Octree-GS …...

中文Kodi媒体中心终极指南:4大本土化插件解决方案

中文Kodi媒体中心终极指南:4大本土化插件解决方案 【免费下载链接】xbmc-addons-chinese Addon scripts, plugins, and skins for XBMC Media Center. Special for chinese laguage. 项目地址: https://gitcode.com/gh_mirrors/xb/xbmc-addons-chinese 你是否…...

Orbit存储系统完全指南:SQLite、IndexedDB与Firestore三大方案深度解析

Orbit存储系统完全指南:SQLite、IndexedDB与Firestore三大方案深度解析 【免费下载链接】orbit Experimental spaced repetition platform for exploring ideas in memory augmentation and programmable attention 项目地址: https://gitcode.com/gh_mirrors/orb…...

pointer reference作为顶层参数(三)

一、核心代码#include "array_FIFO.h"//void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) { void array_FIFO (dout_t d_o[4], din_t *d_i, didx_t idx[4]) { #pragma HLS INTERFACE m_axi depth4 portd_i //#pragma HLS INTERFACE s_axilite register…...

Array作为顶层参数-优化设计(二)

一、核心代码#include "array_FIFO.h"void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) { //void array_FIFO (dout_t d_o[4], din_t *d_i, didx_t idx[4]) { #pragma HLS INTERFACE s_axilite register depth4 portd_i //#pragma HLS INTERFACE s_axi…...