C语言指针详解上
1 野指针
int main01(){//野指针就是没有初始化的指针,指针的指向是随机的,不可以 操作野指针//int a = 0;//指针p保存的地址一定是定义过的(向系统申请过的)int *p;//野指针*p = 200;printf("%d\n",*p);system("pause");return 0;}
2 空指针
空指针的作用: 如果使用完指针将指针赋值为NULL,在使用时判断一下指针是否为NULL,就知道指针有没有被使用
int main(){int a;//将指针的值赋值为0,0x0000000 = NULLint *p = NULL;//给指针p的内容赋值为0*p = 200;//err 因为p保存了0x0000的地址,这个地址是不可以使用的,非法printf("%d\n",*p);system("pause");return 0;}
3 万能指针
万能指针就是可以保存任意的地址
//万能指针int main(){//void b; 不可以定义void类型的变量,因为编译器不知道给变量分配多大的空间//但是可以定义void *类型,因为指针都是4个字节int a = 10;short b = 10;void *p = (void *)&a;//万能指针可以保存任意的地址void *q = (void *)&b;//printf("%d\n", *p);//err p是void*,不知道取几个字节的大小printf("%d\n",* (int *)p);// *( (int *)地址)system("pause");return 0;}
4 const修饰的指针变量
int main(){int a = 10;int b = 20;//const修饰的是 * 还是变量p,//这里修饰的是*//const int *p = &a;//不能通过 *p,改p所指向空间的内容//*p = 100; err 因为不能通过p改p所指向空间的内容//const修饰的变量p//p保存的地址不可以修改//int * const p = &a;//p = &b;err p本身的值不能被更改const int *const p = &a;//p本身的指向不能改变,不能通过*p修改p//向那块空间的内容system("pause");return 0;}
5 多级指针
定义多级指针保存数据的地址时,定义的指针的类型只需要比要保持的数据的类型多一级*
//多级指针int main(){int a = 10;//*p int a int *pint *p = &a;//*q int *p int **qint **q = &p;//如果*和&相遇,相抵消// **q == *(*q) == *(p) == a//**q == *(*q) == *(&a) == aprintf("%d\n", **q);// *k int **q int ***kint ***k = &q;//*符号结合,代表这个k是一个指针变量//k是一个变量//k的类型,将变量k拖黑,剩下的类型//k用来保存谁的地址 将变量k和k最近的*一起拖黑,剩下什么类型//就保存什么类型数据的地址int *******************g;int ********************f = &g;system("pause");return 0;}
6 指针结合数组
指针加1,跨过一个步长
int *p;步长 = sizeof(int)要得到内存的数据,就该先得到数据的地址- (地址) 得到的是地址里面的内容int main(){//int a[10] = {1,2,3,4,5,6,7,8,9,10};int a[10] = { 0 };//a 数组名,首元素的地址int *p = a;//指针p保存的是首元素的地址for (int i=0;i<sizeof(a)/sizeof(a[0]);i++){//printf("%d ",a[i]);//printf("%d ", *(p+i));*(p + i) = i;}for (int i = 0; i<sizeof(a) / sizeof(a[0]); i++){printf("%d ",a[i]);//printf("%d ", *(p+i));//*(p + i) = i;}system("pause");return 0;}
7 指针运算
两指针(类型一致)相减,得到的是中间跨过多少元素
两指针相加没有意义
int main(){int a[10] = {1,2,3,4,5,6,7,8,9,10};//sizeof(int [10])int *p = a;//int *q = (int *)(&a + 1) - 1;int *q = &a[9];printf("%d\n",q-p);// p+9 == qprintf("%d\n",*(p+3));//两指针相加没有意义// printf("%d\n", p+q);errsystem("pause");return 0;}
8 并不是数组的专属
[]== *()int main(){//[] == *()int a[10] = { 1,2,3,4,5,6,7,8,9,10 };int *p = a;for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++){//printf("%d ",a[i]);//a[i] == *(a+i)//printf("%d ", *(p+i));//printf("%d ", p[i]);// p[i] == *(p+i)printf("%d ", *(a + i));}system("pause");return 0;}int main09(){//[]是不是数组的专属//int a[10] = { 1,2,3,4,5,6,7,8,9,10 };// [] == *()//p[0] == *(p+0)int a = 10;int *p = &a;p[0] = 100;//p[1] = 200;printf("a=%d\n",a);system("pause");return 0;}
9 指针数组
整型数组 是一个数组,数组的每一个元素是整型
指针数组 是一个数组,数组的每一个元素都是一个指针
int main(){int a = 10;int b = 20;int c = 30;// int *p1 = &a int *p2 = &a int *p2 = &a//需求: 数组中的每一个元素都是指针(地址)int *num[3] = {&a,&b,&c};//printf("%d\n",sizeof(num));&a == num[0]//for(int i=0;i<sizeof(num)/sizeof(num[0]);i++)//{// printf("%d\n",*num[i]);////}//定义一个指针用来保存数组num首元素的地址// num == &num[0] = &(int *) == int **//num[0]是int *类型,要保持int *类型的地址,需要比它多一级*int **k = num;for (int i = 0; i < sizeof(num) / sizeof(num[0]); i++){printf("%d ",**(k+i));}system("pause");return 0;}

10 指针作为函数的形参
指针作为函数的形参,可以改变实参的值
void swap2(int*x, int *y){int k = *x;*x = *y;*y = k;printf("x=%d y=%d\n", *x, *y);}int main(){int a = 10;int b = 20;//swap(a,b);swap2(&a, &b);printf("a=%d b=%d\n", a, b);system("pause");return 0;}

11 数组作为函数的形参
//数组作为函数的形参会退化为指针//void print_arr(int b[10]) // int *b//void print_arr(int b[1000])//int *bvoid print_arr(int *b,int len){int n = sizeof(b) / sizeof(b[0]); // *(b+0) == *bprintf("n=%d\n",n);for (int i = 0; i <len; i++){printf("%d ",b[i]);}printf("\n");}int main(){int a[10] = { 1,2,3,4,5,6,7,8,9,10 };print_arr(a,sizeof(a)/sizeof(a[0]));//打印数值的内容// &a[0] int *system("pause");return 0;}
12 指针作为函数的返回值
int num = 0;//在函数外面定义的变量叫全局变量,整个工程都可以使用//整个变量程序启动开辟空间,直到程序结束释放空间int * getnum(){//{}中定义的变量叫局部变量,局部变量在函数结束之后的空间会被释放srand(time(NULL));num = rand();return #//}int main(){int * p = getnum();printf("%d\n",*p);system("pause");return 0;}
相关文章:
C语言指针详解上
1 野指针 int main01(){//野指针就是没有初始化的指针,指针的指向是随机的,不可以 操作野指针//int a 0;//指针p保存的地址一定是定义过的(向系统申请过的)int *p;//野指针*p 200;printf("%d\n",*p);system("pause");return 0;}2 空指针 空指针的作用…...
力扣面试150题 | 27.移除元素
力扣面试150题 | 27.移除元素 题目描述解题思路代码实现复杂度分析 题目描述 27.移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必…...
JAVA 通过get,post访问远程接口
get请求 参数拼接在url ?namevalue&sexvalue // httpurlhttp:127.0.0.1/project public static String doGet(String httpurl){HttpURLConnection connection nul;Inputstream is null;BufferedReader br null;String result null;//返回结果字…...
Spark例子
Spark例子 以下是一个简单的AI Spark例子: 假设我们有一个数据集,包含房屋大小、卧室数量和售价。我们想使用Spark来预测房屋售价。 首先,我们需要导入所需的库和数据。在这个例子中,我们将使用Pyspark。 python from pyspark…...
linux下ls和df卡死
1. strace看下卡在哪里 https://lokie.wang/article/43 strace ls strace df -h 2. 原因 https://segmentfault.com/a/1190000040620740 3. fuser 和 umount都不行,最后只能重启 重启机器还起不来了垃圾...
iOS(swiftui)——系统悬浮窗( 可在其他应用上显示,可实时更新内容)
因为ios系统对权限的限制是比较严格的,ios系统本身是不支持全局悬浮窗(可在其他app上显示)。在iphone14及之后的iPhone机型中提供了一个叫 灵动岛的功能,可以在手机上方可以添加一个悬浮窗显示内容并实时更新,但这个功能有很多局限性 如:需要iPhone14及之后的机型且系统…...
css弹窗动画效果,示例弹窗从底部弹出
从底部弹出来,有过渡动画效果 用max-height可以自适应内容的高度,当内容会超过最大高度时可以在弹窗里加个scroll-view 弹窗不能用v-if来隐藏,不然transition没效果,transition只能对已有dom元素起效果,所以用透明和v…...
STM32CubeIDE(CUBE-MX hal库)----RTC时钟,时钟实时显示
系列文章目录 STM32CubeIDE(CUBE-MX hal库)----初尝点亮小灯 STM32CubeIDE(CUBE-MX hal库)----按键控制 STM32CubeIDE(CUBE-MX hal库)----串口通信 STM32CubeIDE(CUBE-MX hal库)----定时器 STM32CubeIDE(CUBE-MX hal库)----蓝牙模块HC-05(详细配置) 前言…...
ubuntu 安装Nvidia驱动
官网下载 sudo bash NVIDIA。。。。。跟着b站机器人工匠阿杰即可。...
『亚马逊云科技产品测评』活动征文|基于亚马逊云EC2搭建PG开源数据库
授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器(Elastic Compute Cloud)是亚马…...
【开题报告】基于J2EE的高校水电费管理系统的设计与实现
1.选题背景 随着高校规模的扩大和信息化建设的深入,学生宿舍的水电费管理成为一项复杂而重要的任务。传统的水电费管理方式通常依赖于人工操作,存在着管理效率低下、数据处理繁琐、费用统计不准确等问题。因此,设计和实现一款基于J2EE的高校…...
Revisiting Proposal-based Object Detection阅读笔记
Revisiting Proposal-based Object Detection阅读笔记 论文地址:link Abstract For any object detector, the obtained box proposals or queries need to be classified and regressed towards ground truth boxes. 对于任何物体检测器来说,获得的…...
Docker部署NFS服务
创建基础镜像 mkdir /data/nfs -p chmod 755 /data/nfs# NFS默认端口: 111、2049、20048 docker run -d \ --privileged \ --name nfs_server \ -p 111:111/tcp \ -p 111:111/udp \ -p 2049:2049/tcp \ -p 2049:2049/udp \ -p 30001-30005:30001-30005/tcp \ -p 30001-30005:3…...
深度学习TensorFlow2基础知识学习后半部分
介绍几个重要操作: 1.范数 a tf.fill([1,2], value2.) b tf.norm(a)# 二范数#第二种计算方法 # 计算验证 a tf.square(a) log("a的平方:", a) a tf.reduce_sum(a) log("a平方后的和:", a) b tf.sqrt(a) log("a平方和后开根号:"…...
电脑系统重装Win10专业版操作教程
用户想给自己的电脑重新安装上Win10专业版系统,但不知道具体的重装步骤。接下来小编将详细介绍Win10系统重新安装的步骤方法,帮助更多的用户完成Win10专业版的重装,重装后用户即可体验到Win10专业版系统带来的丰富功能。 准备工作 1. 一台正常…...
打包Python项目
打包Python项目 本教程将指导您如何打包一个简单的Python项目。它将 向您展示如何添加必要的文件和结构来创建包,如何 构建包,以及如何将其上传到Python包索引(PyPI)。 尖端 如果您在运行本教程中的命令时遇到问题,请…...
使用Python实现爬虫IP负载均衡和高可用集群
做大型爬虫项目经常遇到请求频率过高的问题,这里需要说的是使用爬虫IP可以提高抓取效率,那么我们通过什么方法才能实现爬虫IP负载均衡和高可用集群,并且能快速的部署并且完成爬虫项目。 通常在Python中实现爬虫ip负载均衡和高可用集群需要一…...
Jenkins+Maven+Gitlab+Tomcat 自动化构建打包,部署
环境准备 1、安装服务 Jenkins工具、环境、插件配置 全局变量配置 Manage Jenkins>tools>JDK 安装 安装插件 Deploy to container 安装此插件,才能将打好的包部署到tomcat上 配置国内mvn源 创建maven项目 1 2 3 4 5 6 7 8 9 10...
泰凌微(Telink)8258配置串口收发自定义数据
在官网下载SDK后(以Mesh SDK为例)使用Eclipse打开,对应MCU的配置文件在app_config_8258.h,默认的HCI接口是HCI_USE_NONE,如果改成HCI_USE_UART后可以通过串口收发数据,此时默认接收函数处理的是以Telink的协…...
入门低代码开发:快速构建应用程序的方法
一、什么是低代码 低代码开发是一种通过可视化建模和拖拽式设计工具来快速构建应用程序的方法。传统软件开发通常需要编写大量的代码,而低代码开发则提供了更高层次的抽象,使开发过程更加简单和高效。通过可视化界面,用户可以通过拖拽组件、配…...
ArcSWAT建模踩坑记:你的土壤数据库参数算对了吗?聊聊SPAW的那些默认值和单位陷阱
ArcSWAT土壤参数校准实战:避开SPAW计算中的5个致命误区 当水文模拟结果与实测数据出现系统性偏差时,经验丰富的建模者会首先检查土壤参数——这个隐藏在界面背后的"沉默变量"往往是误差的最大来源。SPAW作为ArcSWAT推荐的土壤参数计算工具&…...
低多边形≠简陋!掌握这7个结构化Prompt技巧,3分钟产出可商用IP形象(附Figma网格对齐校验表)
更多请点击: https://intelliparadigm.com 第一章:低多边形设计的认知革命:从“简陋感”到“结构化美学” 低多边形(Low-Poly)设计曾长期被误读为建模能力不足的妥协产物,但其本质是一场对数字视觉语法的系…...
飞书自动化工具feishu-atuo:Python积木式开发与实战指南
1. 项目概述:飞书自动化,从零到一的效率革命 如果你和我一样,每天的工作流里都离不开飞书,那你肯定也经历过这些时刻:手动把日报、周报从文档复制到表格里归档;在多个群里重复发送同样的通知;为…...
83.人工智能实战:RAG 表格问答怎么做?从前期发现“表格被切碎”到结构化解析、行列索引与答案校验
人工智能实战:RAG 表格问答怎么做?从前期发现“表格被切碎”到结构化解析、行列索引与答案校验 一、问题场景:Word 文档能答,Excel 表格一问就错 很多企业知识库不只有 Word 和 PDF,还有大量表格: 1. 报销标准表 2. 产品价格表 3. 客户等级表 4. SLA 服务等级表 5. 部门…...
未来之窗昭和仙君(九十四)用户指引自助教学源码—东方仙盟
软件教学引导功能说明书未来之窗昭和仙君 - cyberwin_fairyalliance_webquery一、功能概述软件教学引导功能主要用于为用户提供软件操作的引导,通过一系列步骤逐步引导用户完成软件的重要操作。该功能会创建遮罩层、高亮框和提示框,引导用户点击特定元素…...
从零打造开源机械爪:低成本机器人抓取方案全解析
1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫“OpenClawTuto”。光看这个名字,你可能会有点摸不着头脑,它不像“XX管理系统”或者“XX深度学习框架”那样一目了然。但作为一个在开源社区和自动化领域摸爬滚打了十来年的老手…...
Linux权限继承与umask配置实践
Linux权限继承与umask配置实践很多协作目录问题并不是因为当前权限错了,而是因为新建文件的默认权限总是不符合预期。背后的核心变量之一就是 umask。中级阶段如果不理解默认权限是怎么生成的,就会陷入“每次都手工 chmod”的低效循环。一、默认权限不是…...
机械臂时间冲击最优轨迹规划【附代码】
✨ 长期致力于串联机械臂、时间-冲击最优、轨迹规划、多目标粒子群算法、非支配排序遗传算法研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)构建基于…...
Camera Graph™相机拓扑图谱引擎技术白皮书
前言在数字孪生、全域感知、智能安防等领域快速发展的今天,多镜头协同感知已成为实现全域覆盖、精准识别、连续追踪的核心基础。然而,传统多相机部署模式下,各镜头始终处于“孤立工作”状态,数据互通存在壁垒、时空对齐精度不足、…...
AI攻防时间差:当漏洞发现速度碾压修复速度— 聚焦技术核心
AI攻防时间差:当漏洞发现速度碾压修复速度 — 聚焦技术核心 引言:当两个世界碰撞 2026年5月,对于网络安全领域而言,是一个具有分水岭意义的月份。 一边是360人工智能安全研究院在5月12日发布的重磅报告,首次提出**“AI…...
