【C语言】一文讲通 和*
&和*详解
- 前言
- 符号 `&`:取地址符
- `&` 的用法
- `&` 用于函数参数传递
- 符号 `*`:解引用符
- `*` 的用法
- `*` 用于指针的初始化
- 结合使用 `&` 和 `*`
- 1. `*` 和 `&` 配合使用示例
- 常见错误与注意事项
- 总结
前言
在 C 语言中,*
和 &
是两个非常重要的符号,它们在指针、内存管理和函数参数传递等方面起着关键作用。对于许多初学者来说,理解这两个符号的含义和用法可能会有一定的难度,但只要理清它们的关系和用途,就能够轻松掌握这部分知识。本文将详细讲解 *
和 &
的作用、使用场景,并通过实例帮助大家理解。
符号 &
:取地址符
在 C 语言中,&
是“取地址符”。它的作用是获取变量在内存中的地址,即返回变量的指针。
&
的用法
&
用来获取一个变量的内存地址。例如:
#include <stdio.h>int main() {int num = 10;printf("num的内容是: %d\n", num);printf("num的地址是: %p\n", &num);return 0;
}
输出:
num的内容是: 10
num的地址是: 0x7ffeeaef7bfc
在这个例子中,&num
获取了变量 num
的内存地址,并将其打印出来。&
运算符返回的是一个指向 num
变量的指针。
&
用于函数参数传递
&
还可以用在函数的参数传递中,表示将变量的地址传递给函数,从而实现按地址传递参数,也就是我们常说的“传引用”。这与按值传递不同,按值传递是将变量的值直接传递给函数。
#include <stdio.h>void modify(int *ptr) {*ptr = 20; // 修改指针所指向的内存值
}int main() {int num = 10;printf("修改前: %d\n", num);modify(&num); // 传递num的地址printf("修改后: %d\n", num);return 0;
}
输出:
修改前: 10
修改后: 20
在 main
函数中,我们传递了变量 num
的地址 &num
给函数 modify
。在 modify
函数中,通过指针修改了 num
的值。这就是“按地址传递”的体现,允许函数直接修改原始变量的值。
在这个示例中还有一个非常重要的点就是这个函数,因为下文会讲*
,所以我们把这个东西留到最后面讲。
void modify(int *ptr) {*ptr = 20; // 修改指针所指向的内存值
}
符号 *
:解引用符
在 C 语言中,*
是“解引用符”,它用于指针变量。当我们使用指针时,*
可以用来访问指针指向的内存地址中的值。
定义:数据类型 *指针变量名
含义:*指针变量名--代表所指变量的值指针变量名--代表所指变量的地址
*
的用法
*
运算符用于指针变量时,表示解引用,即通过指针访问或修改指针所指向的变量的值。
定义指针变量之后,必须将其与某个变量的地址关联才能使用,关联方式有两种:
-
定义时赋初值,定义指针变量时直接指向变量地址。
例如:int a ; int *p = &a;
-
赋值,将普通变量的地址赋值给指针变量。
int a,*p; p=&a;
示例代码:
#include <stdio.h>int main() {int num = 10,*p;int *ptr = # // ptr 指向 num 的地址p=#// p 指向 num 的地址printf("num 的值是: %d\n", *ptr); // 通过 ptr 获取 num 的值printf("num 的值是: %d\n", *p); // 通过 p 获取 num 的值return 0;
}
输出:
num 的值是: 10
num 的值是: 10
在这个例子中,ptr
是一个指向 num
的指针,而 *ptr
表示解引用指针,获取指针 ptr
所指向内存地址中的值,即 num
的值。
*
用于指针的初始化
指针变量通常在声明时需要初始化为某个地址值,这个地址可以通过 &
运算符获取。*
运算符通常用来声明指针变量时表示该变量存储的是一个地址,并指向某种数据类型。
#include <stdio.h>int main() {int num = 100;int *ptr = # // ptr 是一个指向 int 类型的指针printf("num 的地址: %p\n", ptr);printf("num 的值: %d\n", *ptr);return 0;
}
输出:
num 的地址: 0x7ffeeaef7bfc
num 的值: 100
在此代码中,ptr
是指向 int
类型的指针,指向 num
的地址。通过 *ptr
解引用,我们获得了 num
的值。
结合使用 &
和 *
&
和 *
是互相配合的,它们常常一起使用。我们可以通过 &
获取一个变量的地址,再通过 *
解引用指针访问地址处的值,或者反过来,通过 *
创建一个指针,再用 &
获取指针指向的地址。
1. *
和 &
配合使用示例
#include <stdio.h>void add_1(int a,int b){a = 10;b = a + b;
}void add_2(int *a,int *b){*a = 10;*b = *a + *b;
}int main() {int a = 5 , b = 3;int num_1 , num_2;add_1( a , b );printf("a = %d , b = %d\n",a,b); // 打印 a b 的值add_2( &a , &b );printf("a = %d , b = %d\n",a,b); // 打印 a b 的值return 0;
}
输出:
a = 5 , b = 3
a = 10, b = 13
在这个例子中,add_1读取了a b 两个变量的值,不能对a,b两个变量本身的值进行改变;add_2使用*
解引用,直接对a b两个变量进行操作,既可以读变量的值,也可以修改变量的值。但需要注意的是,使用了*
要用&
进行地址的赋值。
常见错误与注意事项
-
指针未初始化:
使用*
时,指针必须指向有效的内存地址。如果指针没有初始化,解引用会导致程序崩溃。int *ptr; // 未初始化指针 *ptr = 10; // 错误:未初始化的指针解引用
-
误用
&
和*
:
&
和*
要注意区分使用。&
获取的是地址,而*
获取的是指针指向的值。如果弄反了,会引发错误。int num = 5; int *ptr = # printf("%d\n", &ptr); // 错误:&ptr 会返回 ptr 的地址,而不是 ptr 指向的值
总结
&
是取地址符,获取一个变量在内存中的地址。*
是解引用符,用于访问指针指向的内存中的值。- 它们通常配合使用,
&
用来获取变量的地址,*
用来通过指针访问地址处的值。 - 使用
*
和&
时,需要确保指针指向有效的内存地址,否则会出现运行时错误。
通过理解并掌握 &
和 *
的用法,你可以深入理解 C 语言中的指针,进而更好地管理内存、实现函数参数的高效传递等操作。
相关文章:
【C语言】一文讲通 和*
&和*详解 前言符号 &:取地址符& 的用法& 用于函数参数传递 符号 *:解引用符* 的用法* 用于指针的初始化 结合使用 & 和 *1. * 和 & 配合使用示例 常见错误与注意事项总结 前言 在 C 语言中,* 和 & 是两个非常重…...
编译原理复习---基本概念+推导树
适用于电子科技大学编译原理期末考试复习。 本文只适合复习不适合预习,即适合上课听过一点或自己学过一点的同学。 1. 编译原理概述 编译原理是计算机科学的一个重要分支,它涉及将高级编程语言编写的源代码转换为机器能够理解和执行的低级代码的过程。…...
ThinkPHP 吸收了Java Spring框架一些特性
ThinkPHP 吸收了Java Spring框架一些特性,下面介绍如下: 1、controller 控制器层 存放控制器层的文件,用于处理请求和响应 2、model 实体类 存放实体类的文件,用于定义数据模型 3、dao DAO层 存放DAO(数据访问…...
【Java基础面试题019】什么是Java中的不可变类?
回答重点 不可变类是指在创建后无法被修改的类。一旦对象被创建,它的所有属性都不能被更改。这种类的实例在整个生命周期内保持不变。 关键特征: 声明类为final,防止子类继承类的所有字段都是private和final,确保它们在初始化后…...
JAVA开发时获取用户信息失败,分析后端日志信息
从日志信息(见文章最后)来看,JWT 认证过程似乎是成功的。具体来说,以下几点表明认证流程正常: Token 解析成功: 日志显示 Parsing token: eyJhbGciOiJIUzUxMiJ9.eyJ1c2VySWQiOjEsImV4cCI6MTczNDM2MzUwMH0.jQtaj1sTBCMh…...
Docker 安装 禅道-21.2版本-外部数据库模式
Docker 安装系列 1、拉取最新版本(zentao 21.2) [rootTseng ~]# docker pull hub.zentao.net/app/zentao Using default tag: latest latest: Pulling from app/zentao 55ab1b300d4b: Pull complete 6b5749e5ef1d: Pull complete bdccb03403c1: Pul…...
如何写好一份技术文档?
技术文档是传递技术信息、指导用户操作的重要工具。一份高质量的技术文档不仅能帮助用户快速理解和使用技术产品,还能减少后续的维护和支持成本。本文将详细介绍如何撰写一份优秀的技术文档。 一、明确目标受众 在开始撰写技术文档之前,首先要明确目标受…...
常用es命令
常用Elasticsearch命令 es别名链接和删除 POST /_aliases {"actions": [{"add": {"index": "index","alias": "alias"}},{"remove": {"index": "index","alias": &quo…...
AI大模型进一步推动了AI在处理图片、视频、音频、文本的等数据应用
AI处理图片、视频、音频、文本等数据应用一直都存在,但是大模型的出现让AI处理这些数据更加便捷快速。比如在安防的框选标记物,以前要在图像上框,现在用文字描述再让大模型处理成图片框就可以完成框选了。大模型正在二次加速AI处理。 随着AI…...
【MambaSR复现】【Windows系统下Mamba环境配置】triton 、causal conv1d和mamba_ssm模块配置保姆教程
注:在此之前确保环境中已经安装packaging模块 pip install packaging若此模块安装过程中出现图下报错:这是由于环境创建时候的权限问题导致的,具体解决方案见我另一篇博文! 1.Triton模块安装 注意:必须先安装triton&…...
前景物体提取
参考:精选课:C完整的实现双目摄像头图像采集、双目摄像头畸变矫正、前景物体提取、生成视差图、深度图、PCL点云图 前景物体提取是计算机视觉中的一个重要技术,可以用于视频监控、虚拟现实和计算机视觉等领域。 1.前景物体提取的原理 前景…...
【考前预习】4.计算机网络—网络层
往期推荐 【考前预习】3.计算机网络—数据链路层-CSDN博客 【考前预习】2.计算机网络—物理层-CSDN博客 【考前预习】1.计算机网络概述-CSDN博客 目录 1.网络层概述 2.网络层提供的两种服务 3.分类编址的IPV4 4.无分类编址的IPV4—CIDR 5.IPV4地址应用规划 5.1使用定长子…...
浙江省一体化数字资源系统(IRS)介绍(七个方面展开)
浙江IRS的主要做法包括“六个一”,即一本账管理、一站式浏览、一揽子申请、一体化生产、一平台调度、一张网管控。本期分享在2023年数字政府评估大会上,浙江省大数据相关老师发表的“打造一体化数字资源系统(IRS),赋能…...
Spring实例化的基本流程和Bean处理器
目录 Spring实例化的基本流程 Bean的处理器 Bean工厂后处理器(BeanFactoryPostProcessor) 动态注册beanDefinition Bean后处理器(BeanPostProcessor) Spring实例化的基本流程 在了解处理器之前,要清除spring实例化…...
对分布式系统的理解以及redis的分布式实现
对分布式系统有哪些了解? 分布式系统是由多个独立的计算节点(通常是计算机或服务器)组成的系统,这些节点通过网络相互通信和协作,共同完成任务。分布式系统的设计旨在提供可扩展性、容错性和高可用性,适用于大规模的数据处理和服务场景。 1. 分布式系统的核心特点 分布…...
torch.multiprocessing 向Process传递对象参数报错 Can‘t pickle local object
如下代码所示,使用torch.multiprocessing启动多进程,并传递了model和image_processor两个对象作为参数。 from torch.multiprocessing import Process, Queue, Manager...p3 Process(targetframe_memory_manager,args(model, image_processor, frame_q…...
Day9 神经网络的偏导数基础
多变量函数与神经网络 在神经网络中,我们经常遇到多变量函数。这些函数通常描述了网络的输入、权重、偏置与输出之间的关系。例如,一个简单的神经元输出可以表示为: z f ( w 1 x 1 w 2 x 2 … w n x n b ) z f(w_1x_1 w_2x_2 \ldots…...
[c++11(二)]Lambda表达式和Function包装器及bind函数
1.前言 Lambda表达式着重解决的是在某种场景下使用仿函数困难的问题,而function着重解决的是函数指针的问题,它能够将其简单化。 本章重点: 本章将着重讲解lambda表达式的规则和使用场景,以及function的使用场景及bind函数的相关使…...
22智能 狄克斯特拉算法复习
狄克斯特拉算法 图 根据边有无方向分为: 有向图、无向图 根据边有无权重变量分为: 有权图、无权图 根据顶点是否连通分为: 连通图和非连通图入度:表示有多少条边指向该顶点出度:表示有多少条边从该顶点指出算法步骤&a…...
Electronjs+Vue如何开发PC桌面客户端(Windows,Mac,Linux)
electronjs官网 https://www.electronjs.org/zh/ Electron开发PC桌面客户端的技术选型非常适合已经有web前端开发人员的团队。能够很丝滑的过渡。 Electron是什么? Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.…...
C语言编程1.27汉诺塔
题目描述 给定一个由n个圆盘组成的塔,这些圆盘按照大小递减的方式套在第一根桩柱上。现要将整个塔移动到另一根桩柱上,每次只能移动一个圆盘,且较大的圆盘在移动过程中不能放置在较小的圆盘上面。 输入格式 输入由四行: 第一行…...
UG NX二次开发(C#)-机电概念设计-UIStyler中selection块选择信号等对象的过滤器设置
文章目录 1、前言2、创建机电概念设计的模型3、创建UIStyler4、在VS2022中创建NXOPEN CSHAP的工程5、设置信号与信号适配体的过滤器6、测试选择的对象1、前言 在UG NX二次开发过程中,经常会用到UIStyler中的Selection块,即是选择对象,选择对象由于其可以选择多种类型的对象…...
【C++】C++中的lambda函数详解
C中的lambda函数是一种匿名函数,它允许你在代码中直接定义一个函数对象,而不需要提前声明一个函数名。Lambda函数通常用于编写简短的函数,这些函数可能只会被调用一次或者在某些特定的上下文中使用。 Lambda函数的基本语法如下: …...
JS CSS HTML 的代码如何快速封装
我们为什么要封装代码,是因为封装后的代码,会显得非常美观,减少代码的复用,方便我们更好的去维护代码,不用一个一个页面的去找去改,直接封装好的代码里面去改就可以了 目录 1.html代码封装 2.CSS代码封装…...
矩阵运算的复杂度分析(Complexity Analysis of Matrix Operations):中英双语
矩阵运算的复杂度分析 矩阵运算在科学计算、机器学习、图像处理等领域中起着至关重要的作用。了解各种常见矩阵运算的复杂度,对于优化算法、提高计算效率具有重要意义。在这篇博客中,我们将详细探讨矩阵加法、标量乘法、矩阵转置、矩阵-向量乘法等基本矩…...
第二十四天 循环神经网络(RNN)LSTM与GRU
LSTM(长短期记忆网络)和GRU(门控循环单元)是两种流行的循环神经网络变体,它们被设计来解决传统RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题。这两种网络都通过引入门控机制来控制信息的流动,从而能…...
RTC实时时钟
BKP(备份寄存器) 1. 什么是BKP? 备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域里,当VDD电 源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒ÿ…...
移动网络(2,3,4,5G)设备TCP通讯调试方法
背景: 当设备是移动网络设备连接云平台的时候,如果服务器没有收到网络数据,移动物联设备发送不知道有没有有丢失数据的时候,需要一个抓取设备出来的数据和服务器下发的数据的方法。 1.服务器系统是很成熟的,一般是linu…...
项目二十三:电阻测量(需要简单的外围检测电路,将电阻转换为电压)测量100,1k,4.7k,10k,20k的电阻阻值,由数码管显示。要求测试误差 <10%
资料查找: 01 方案选择 使用单片机测量电阻有多种方法,以下是一些常见的方法及其原理: 串联分压法(ADC) 原理:根据串联电路的分压原理,通过测量已知电阻和待测电阻上的电压,计算出…...
如何使用checkBox组件实现复选框
文章目录 概念介绍使用方法示例代码我们在上一章回中介绍了DatePickerDialog Widget相关的内容,本章回中将介绍Checkbox Widget.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里说的Checkbox也是叫复选框,没有选中时是一个正方形边框,边框内容是空白的,选中时会…...
用bootstrap搭建侧边栏
要注意: 标签的id"v-pills-dataset1-tab"要和跳转内容的aria-labelledby"v-pills-dataset1-tab"一致 标签的aria-controls"v-pills-dataset1"要和跳转内容的id"v-pills-dataset1"一致 <!-- 左边的列(侧边栏…...
手眼标定工具操作文档
1.手眼标定原理介绍 术语介绍 手眼标定:为了获取相机与机器人坐标系之间得位姿转换关系,需要对相机和机器人坐标系进行标定,该标定过程成为手眼标定,用于存储这一组转换关系的文件称为手眼标定文件。 ETH:即Eye To …...
巧记斜边函数hypot
hypot是一个数学函数,源于英文"hypotenuse(斜边)",hypot(a, b)返回直角边边长为a、b的直角三角形(right-angled triangle)的斜边长度。该函数定义在<math.h>头文件中,其功能相当…...
STM32单片机芯片与内部33 ADC 单通道连续DMA
目录 一、ADC DMA配置——标准库 1、ADC配置 2、DMA配置 二、ADC DMA配置——HAL库 1、ADC配置 2、DMA配置 三、用户侧 1、DMA开关 (1)、标准库 (2)、HAL库 2、DMA乒乓 (1)、标准库 ÿ…...
【程序人生】掌握一门编程语言
掌握一门编程语言不仅仅是能够编写正确的语法,它还涉及到对语言特性、工具链、最佳实践以及解决问题的能力有深入的理解。以下是衡量你是否掌握了某门编程语言的关键指标: 语法与基本概念 语法熟悉度:能够在不查阅文档的情况下写出正确的代码…...
数据库发生了死锁怎么办
当项目中存在公共的数据表,比如日志表,同时存在对这张表的读写操作,或者是对数据量较大的表加索引同时伴随其他并发操作,那么这张表就有较高概率发生死锁。 现象:对于这张表的任何操作都会被阻塞,项目出现…...
传递函数的幅值在0到1之间
为什么所有传递函数的幅值应该在 0 到 1 之间 在声学、振动学和信号处理等领域,传递函数的幅值表示系统对输入信号的响应幅度。在许多声学实验中,传递函数的幅值反映了声波的传输或反射特性。理论上,所有传递函数的幅值应当在 0 到 1 之间&a…...
[Unity Shader]【图形渲染】 数学基础4 - 矩阵定义和矩阵运算详解
矩阵是计算机图形学中的重要数学工具,尤其在Shader编程中,它被广泛用于坐标变换、投影变换和模型动画等场景。本文将详细介绍矩阵的定义、基本运算以及如何在Shader中应用矩阵,为初学者打下坚实的数学基础。 一、什么是矩阵? 矩阵是一个由数字排列成的长方形数组,通常记作…...
蓝桥杯练习生第四天
小蓝每天都锻炼身体。 正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(11 日),为了激励自己,小蓝要跑 22 千米。如果同时是周一或月初,小蓝也是跑 22 千米。 小蓝跑步已经坚持了很长时间&#x…...
Jmeter压测实战:Jmeter二次开发之自定义函数
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具,具备轻量、高扩展性、分布式等特性。Jmeter已支持实现随机数、计数器、时间戳、大小写转换…...
梯度(Gradient)和 雅各比矩阵(Jacobian Matrix)的区别和联系:中英双语
雅各比矩阵与梯度:区别与联系 在数学与机器学习中,梯度(Gradient) 和 雅各比矩阵(Jacobian Matrix) 是两个核心概念。虽然它们都描述了函数的变化率,但应用场景和具体形式有所不同。本文将通过…...
[python SQLAlchemy数据库操作入门]-02.交易数据实体类建立
哈喽,大家好,我是木头左! 为了顺利地使用SQLAlchemy进行股票交易数据的处理,首先需要搭建一个合适的开发环境。这包括安装必要的软件包以及配置相关的依赖项。 安装Python及虚拟环境 下载并安装Python(推荐使用最新版)。创建一个新的虚拟环境以避免依赖冲突。python -m …...
python打包exe文件
由于用户需要,将采集数据解析成txt文件,为了方便使用,将python解析方法打包成exe文件供用户使用 安装环境 ./pip.exe install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simplepython导入需要的包 import tkinter as tk from tkin…...
C# opencvsharp 流程化-脚本化-(2)ROI
ROI ROI也是经常需要使用的方法。特别是在图像编辑中。ROI又称感兴趣的区域,但是图像是矩阵是矩形的,感兴趣的是乱八七糟的,所以还有一个Mask需要了解一下的。 public class RoiStep : IImageProcessingStep{public ImageProcessingStepType…...
【Python】基于Python的CI/CD工具链:实现自动化构建与发布
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代软件开发中,持续集成(CI)和持续交付(CD)已经成为提高开发效率和软件质量的重要实践。CI/CD流程帮助开发团队自动化构建、测试、…...
Flutter组件————Scaffold
Scaffold Scaffold 是一个基础的可视化界面结构组件,它实现了基本的Material Design布局结构。使用 Scaffold 可以快速地搭建起包含应用栏(AppBar)、内容区域(body)、抽屉菜单(Drawer)、底部导…...
2024年《网络安全事件应急指南》
在这个信息技术日新月异的时代,网络攻击手段的复杂性与日俱增,安全威胁层出不穷,给企事业单位的安全防护能力带 来了前所未有的挑战。深信服安全应急响应中心(以下简称“应急响应中心”)编写了《网络安全事件应急指南》…...
通过smem 定时检测系统内存占用情况
编写定时任务脚本 cat >> /usr/local/bin/smem.sh <<-"EOF"if [[ ! -d /var/log/smem ]];thenmkdir -p /var/log/smem fi smem -tk >> /var/log/smem/smem.log EOFchmod 755 /usr/local/bin/smem.sh配置定时任务 echo "" >> /et…...
京准电钟:电厂自控NTP时间同步服务器技术方案
京准电钟:电厂自控NTP时间同步服务器技术方案 京准电钟:电厂自控NTP时间同步服务器技术方案 随着计算机和网络通信技术的飞速发展,火电厂热工自动化系统数字化、网络化的时代已经到来。一方面它为控制和信息系统之间的数据交换、分析和应用…...
Face to face
1.西班牙添加5G volte 首先carrierconfig里使能 <boolean name"carrier_nr_available_bool" value"true" /> <boolean name"carrier_volte_available_bool" value"true" /> 其次 组件apn配置ims参数 2.印度j…...