【C语言精髓 之 指针】指针*、取地址、解引用*、引用

news2024/11/25 4:55:03
/**
 * @file            
 * @author          jUicE_g2R(qq:3406291309)————彬(bin-必应)
 *						一个某双流一大学通信与信息专业大二在读	
 * @copyright       2023.9
 * @COPYRIGHT			 原创技术笔记:转载需获得博主本人同意,且需标明转载源
 * @language        C 
 */
  • UpData Log👆 2023.9.22 更新进行中
  • Statement0🥇 一起进步
  • Statement1💯 有些描述是个人理解,可能不够标准,但能达其意

技术提升站点

  • 定义指针 与 取地址
int val=1;		//为 变量名为val 的 整型数据 开辟空间,并存下val的值
int* p=&val;	//定义一个指针变量(是指针的原因使用到了*)的名字为p,p记录的是(&val)val变量的地址,此时 p指针 指向 val 这个整型变量
printf("%d 的地址是 %p\n",val, p);
  • 解引用:返回p所指对象的值
//要使用 p所指向地址的值(即val的值) 的话,需要 将p(实质上是 val 的地址)通过 * 解出来
printf("指针p指向的val的地址为 %p,解引用得到val的值为%d",p, *p);
  • 通过 指针 修改 指针 所指地址的变量的值
//定义指针后,*p 实质上就是 val,修改 *p 就是修改 val(因为变量名val 与 p 都指向的 val的地址)
*p=2;			//此时 *p=val=2
printf("修改后val的值为:%d",val);
  • 修改指针的指向
//声明两个变量,
int a=1,b=2;
int* p=&a;		//初始化 p 指向a变量
p=&b;			//修改 p指针 存储 b的地址,p由 指向a变量 变为 指向b变量
printf("修改后的p指针指向的值为:%d",*p);
  • 无指向的野指针

注:声明一个指针但不给分配指向,这个指针是无效的野指针(必须要给指针明确的指向)

要先为 开辟一个空间(内存) 来进行 存储、调用、修改 操作

//错误示范
int* p;
*p=2; cout<<*p;

//下面这种是可以的
int* p;int val;
p=&val;			//分配指向
*p=2;
  • 输入
int val;    int *p=&val;
scanf("%d",p);      //p=&val,效果等同于scanf("%d",&val)
printf("%d",val);
  • (*p)++ 、 * (p++) 、*p++ 的区别

运算符优先级

点击了解更多

圆括号()优先级高于下面两种,结合方式是 自左向右不论任何情况先执行括号内的东西!

自增运算符++(不论前缀还是后缀) > 取值运算符*,这两种的结合方式都是 自右向左

//(*p)++ :p指针指向对象的值加1(地址值不变)
int val=1;    int* p=&val;
(*p)++;		printf("p指针指向对象的值为%d,val的值为%d",(*p), val);//Output:2,2

//*(p++) 与 *p++ 操作结果相同,都是将地址值加1个整型字节(4bit)
int val=1;    int* p=&val;
printf("val的地址为%p\n",p);
*p++;			//现在的p指针就是一个野指针,(*p)是无效的
printf("p指针的值(地址)为%p",p);
//Output:
val的地址为63fe14
p指针的值(地址)为63fe18

根据运算符优先级的结合方式可以推出:++ *p++(*p)(思索一下自右向左的意思)操作的结果是一致的(即对 p指针指向对象的值加1)

  • 传参与收参

如何修改 val 的值?

/*---------传参直接传地址--------*/
//传的如果是地址的话,都是直接对 &val这个地址 进行操作(来直接修改地址对应的值)
void Update(int* addr){ //(接收参数的是地址)声明一个指针变量为address(此时 address=p=&val)
    (*addr)++;          //将地址 解引用 得到值,对值修改
}
/*写法二
void Update(int* addr){
	int temp=(*addr);   //申请一个新内存,用来操作值,然后将p指向对象的值存下(temp现在就是 val的值 的代理人)
    temp++;		(*addr)=temp;   
}
*/
int main(int argc,char* argv[]){
    int val=1;    int* p=&val;
    Update(p);          //传入的是 &val(val的地址)
    printf("%d",val);   return 0;
}//Output:2

/*---------传参传的是val的值(地址的解引用)--------*/
void Update(int temp){ 
    temp++;				//此时的修改是影响不到val的
}
int main(int argc,char* argv[]){
    int val=1;    int* p=&val;
    Update(*p);        //传入的是 val(val的值),就和传普通的变量一样!
    printf("%d",val);   return 0;
}//Output:1

指针 是 C语言 的精华,是 C语言 的尽头,值得细品!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1036752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能驱动的自然语言处理:解锁文本数据的价值

文章目录 什么是自然语言处理&#xff1f;NLP的应用领域1. 情感分析2. 机器翻译3. 智能助手4. 医疗保健5. 舆情分析 使用Python进行NLP避免NLP中的陷阱结论 &#x1f389;欢迎来到AIGC人工智能专栏~人工智能驱动的自然语言处理&#xff1a;解锁文本数据的价值 ☆* o(≧▽≦)o *…

flutter web 优化和flutter_admin_template

文章目录 Flutter Admin TemplateLive demo: https://githubityu.github.io/live_flutter_adminWeb 优化 Setup登录注册英文 亮色主题 中文 暗黑主题管理员登录权限 根据权限动态添加路由 第三方依赖License最后参考学习 Flutter Admin Template Responsive web with light/da…

C++ 学习系列 -- std::vector (未完待续)

一 std::vector 是什么&#xff1f; vector 是c 中一种序列式容器&#xff0c;与前面说的 array 类似&#xff0c;其内存分配是连续的&#xff0c;但是与 array 不同的地方在于&#xff0c;vector 在运行时是可以动态扩容的&#xff0c;此外 vector 提供了许多方便的操作&…

世界前沿技术发展报告2023《世界信息技术发展报告》(四)电子信息技术

&#xff08;四&#xff09;电子信息技术 1. 概述2. 微电子技术2.1 精细制程芯片2.1.1 中国台积电发布2纳米制程工艺细节2.1.2 美国英特尔公司称2030年芯片晶体管密度将达到目前的10倍2.1.3 韩国三星电子率先实现3纳米制程芯片量产2.1.4 日本丰田、索尼等8家公司合资成立高端芯…

【李沐深度学习笔记】矩阵计算(1)

课程地址和说明 线性代数实现p4 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 本节是第一篇 矩阵计算 标量导数 导数刻画的是函数在某点的瞬时变化率 这东西都是考研学过的&#xff0c;快速略过&#xff0c;如…

网站接入公网并配置域名访问【详细教程】

网站接入公网并配置域名访问【详细教程】 安装Nginx上传网页文件配置Nginx腾讯云配置域名映射接入公网备案流程 本教程将以腾讯云服务器和腾讯云域名为例&#xff0c;介绍如何快速将网站接入公网并配置域名访问。我们将使用xshell工具进行操作&#xff0c;并涵盖安装nginx、上传…

Unity之VR如何实现跟随视角的UI

前言 我们在制作VR项目的时候,大部分时候,是把UI固定到一个位置,比如桌子或者空中,这么做固然稳定,但是当我们有以下需求的时候,固定位置的UI可能会不适用: 1.场景较小,操作物体占用了很大体积,没有固定的可以清晰显示完整UI的位置。 2.需要频繁的前后左右,更换姿势…

Unity3D 使用LineRenderer自由画线

原理 一个LineRenderer是一次画线&#xff0c;需要使用对象池一帧记录一个鼠标位置 代码 这是线绘制器的代码&#xff0c;依赖于笔者写过的一个简易对象池 传送门&#xff1a;>>对象池 using EasyAVG; using System; using System.Collections.Generic; using UnityEn…

指针和数组笔试题的透析

指针---进阶篇&#xff08;三&#xff09; 一、前言二、一维数组例题透析&#xff1a;三、指针笔试题1.例一&#xff1a;2.例二&#xff1a;3.例三&#xff1a;4.例四&#xff1a;5.例五&#xff1a;6.例六&#xff1a; 一、前言 那么好了好了&#xff0c;宝子们&#xff0c;从…

王道408计组汇编语言部分学习总结

x86汇编语言指令基础 x86处理器中程序计数器PC 通常被称为IP 高级语言—>汇编语言—>机器语言 x86架构CPU&#xff0c;有哪些寄存器 EAX通用寄存器EBXECXEDXESI 变址寄存器 变址寄存器可用于线性表、字符串的处理EDIEBP堆栈基指针堆栈寄存器用于实现函数调用 ESP堆栈…

LESS的叶绿素荧光模拟实现与操作

LESS的叶绿素荧光模拟实现与操作 前情提要FLUSPECT模型荧光的三维面元冠层辐射传输过程日光诱导叶绿素荧光模拟 前情提要 本文默认您对LESS (LargE-Scale remote sensing data and image Simulation framework) 模型和叶绿素荧光(Sun-Induced chlorophyll Fluorescence, SIF)有…

2023华为杯研究生数学建模研赛E题出血脑卒中完整论文(含28个详细预处理数据及结果表格)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了全国研究生数学建模竞赛&#xff08;数模研赛&#xff09;E题完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。…

高级运维学习(十)系统安全

kali 实际上它就是一个预安装了很多安全工具的Debian Linux [rootmyhost ~]# kali reset kali reset OK. 该虚拟机系统用户名为:kali,密码为:kali 基础配置 $ ip a s # 查看网络IP地址&#xff0c;本例中查看到的是192.168.88.40 $ sudo systemctl start ssh # 启s…

java面试题-并发编程基础

1.线程的基础知识 1.1 线程和进程的区别&#xff1f; 难易程度&#xff1a;☆☆ 出现频率&#xff1a;☆☆☆ 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 CPU&#xff0c;数据加载至内存。在指令运行过程中还需要…

驱动开发,基于gpio子系统编写LED灯的驱动,亮灭控制

1.gpio子系统介绍 一个芯片厂商生产出芯片后会给linux提供一个当前芯片中gpio外设的驱动&#xff0c;我们当前只需要调用对应的厂商驱动即可完成硬件的控制。而linux内核源码中的gpio厂商驱动有很多&#xff0c;这里linux内核对厂商驱动做了一些封装&#xff0c;提供了一系列的…

中秋国庆内卷之我爱学习C++

文章目录 前言Ⅰ. 内联函数0x00 内联函数和宏的比较0x01 内联函数的概念0x02 内联函数的特性 Ⅱ. auto&#xff08;C 11)0x00 auto的概念0x01 auto的用途 Ⅲ. 范围for循环(C11)0x00 基本用法0x01 范围for循环(C11)的使用条件 Ⅳ. 指针空值nullptr(C11)0x00 概念 前言 亲爱的夏…

leetcode Top100(17)矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; 输入&…

C++ -- 类型转换

目录 C语言中的类型转换 为什么C需要四种类型转换 C 类型转换 static_cast reinterpret_cast const_cast 添加关键字 volatile dynamic_cast 补充 RTTI 总结 C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型…

如何搜索浏览器添加印象笔记中搜藏的结果

在印象笔记记录的东西多了&#xff0c;就放在哪里不动&#xff0c;失去记录的意义了 1、如何将浏览器中添加印象笔记一块的搜索结果 2、需要两个步骤 第一&#xff1a;将浏览器中添加印象笔记的插件 第二&#xff1a;将印象笔记中的搜索方法勾上&#xff0c;如下 结果如下&…

【从0学习Solidity】41. WETH

【从0学习Solidity】41. WETH 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0c;探索全栈开发…