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

指针和引用;内联函数和普通函数

1. 指针和引用

1.1 定义和性质区别

  1. 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
  2. 可以有const指针,常量指针可以改变指向,指针常量不能改变指向,也可以有const引用,引用的指向不能改变
  3. 指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
  4. 指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化
  5. 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后指向的内存单元不再改变;
  6. “sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小,即地址的大小;
  7. 指针和引用的自增(++)运算意义不一样;

1.2 指针和引用作为函数参数进行传递时的区别

用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址,因此使用*a实际上是取存储实参的内存单元里的数据,即是对实参进行改变,因此可以达到目的。

在将引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形参的修改其实是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可以节约空间。、

1.3 何时使用引用和指针

指向空值,可改变指向,多级传递:指针;可用引用的地方都可用用指针,反之不行。

2. 内联函数和普通函数的区别

普通函数调用时会使程序跳到另一个地址(函数的地址),并且在函数结束时返回。

  1. 执行函数调用指令,立即存储该指令的地址,并将函数参数保存到的堆栈。
  2. 跳到函数起点的内存单元,执行函数代码(将返回值保存到寄存器中。
  3. 跳回被保存指令的地址处。

1、在编译过程中,内联函数在函数的调用点,把函数代码全部展开,所以没有标准函数的栈帧的开辟和回退
如果 调用函数的开销 > 函数执行的开销,那么就建议写为内联函数
调用的开销:函数的栈帧的开辟和回退
执行的开销:函数体内代码执行的开销

2、内联函数只在本文件可见,编译阶段就进行了替换,所以不产生符号,所以一般在头文件中定义,这样就可以在其它文件调用。普通函数产生符号,多个文件引用头文件,会产生符号重定义的错误。
.编译阶段不编译.h文件,只编译.c 或.cpp 文件

注意:inline只在release版本起作用,debug版本inline函数也需要栈帧的开辟和回退

思考?

我们说到内联函数是编译器用函数相应的代码替代了函数调用

那内联函数还遵循按值传递参数吗?

a到底是0还是1?

inline void fun(int a){a=1;}int main(){int a=0;fun(a);cout<<a;return 0;
}

 在编译器看来:

inline void fun(int a){a=1;}int main(){int a=0;a=1; //fun(a);cout<<a;return 0;
}

输出结果:

输出表明,内联函数和普通函数一样,都是按值传递参数。 

相关文章:

指针和引用;内联函数和普通函数

1. 指针和引用 1.1 定义和性质区别 指针是一个变量&#xff0c;只不过这个变量存储的是一个地址&#xff0c;指向内存的一个存储单元&#xff1b;而引用跟原来的变量实质上是同一个东西&#xff0c;只不过是原变量的一个别名而已。可以有const指针&#xff0c;常量指针可以改…...

简单题67.二进制求和 (java)20240919

题目描述&#xff1a; Java&#xff1a; class Solution {public String addBinary(String a, String b) {StringBuilder result new StringBuilder();int i a.length()-1;int j b.length()-1;int carry 0; //记录进位信息while(i>0 || j>0 || carry!0){int sum ca…...

DDD的主要流程

DDD 开发流程分为模型的建立和模型的实现两大部分&#xff0c;接下来是具体的流程讲解以及流程图。 1. 模型的建立 捕获行为需求&#xff1a;在这一阶段&#xff0c;团队要识别系统中需要完成的任务、操作流程、功能需求以及每个功能由谁操作、会产生什么结果。我们可以通过 …...

linux驱动开发-设备树

设备树的历史背景 背景&#xff1a; 在早期的嵌入式系统中&#xff0c;硬件配置信息通常硬编码在内核源码中&#xff0c;这导致了内核代码的冗长和难以维护。 为了解决这个问题&#xff0c;设备树&#xff08;Device Tree&#xff09;被引入&#xff0c;使得硬件描述与内核代…...

数据结构——二叉树堆的专题

1.堆的概念及结构 如果有一个关键码的集合K {K0 &#xff0c;K1 &#xff0c;K2 &#xff0c;K3…&#xff0c;K(N-1) }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;并满足&#xff1a;Ki < K2*i1且 Ki<K2*i2 ) i 0&#…...

【C语言零基础入门篇 - 7】:拆解函数的奥秘:定义、声明、变量,传递须知,嵌套玩转,递归惊艳

文章目录 函数函数的定义与声明局部变量和全局变量、静态变量静态变量和动态变量函数的值传递函数参数的地址传值 函数的嵌套使用函数的递归调用 函数 函数的定义与声明 函数的概念&#xff1a;函数是C语言项目的基本组成单位。实现一个功能可以封装一个函数来实现。定义函数的…...

ClickHouse在AI领域的结合应用

文章目录 引言1.1 人工智能与大数据的融合1.2 ClickHouse在大数据平台中的地位2.1 BI与AI的融合从传统BI到智能BIAI赋能BI融合的优势实际应用案例 2.2 异构数据处理的重要性数据多样性的挑战异构数据处理的需求技术实现实际应用案例 2.3 向量检索与AIOps技术向量检索的背景AIOp…...

git push出错Push cannot contain secrets

报错原因&#xff1a; 因为你的代码里面包含了github token明文信息&#xff0c;github担心你的token会泄漏&#xff0c;所以就不允许你推送这些内容。 解决办法&#xff1a; 需要先把代码里面的github token信息删除掉&#xff0c;并且删掉之前的历史提交&#xff0c;只要包…...

OpenAI 的最强模型 o1 的“护城河”失守?谷歌 DeepMind 早已揭示相同原理

发布不到一周&#xff0c;OpenAI 的最新模型 o1 的“护城河”似乎已经失守。 近日&#xff0c;有人发现谷歌 DeepMind 早在今年 8 月发表的一篇论文&#xff0c;揭示了与 o1 模型极其相似的工作原理。 这项研究指出&#xff0c;在模型推理过程中增加测试时的计算量&#xff0c…...

【胡乱念叨】大模型的“我”

下面的内容很有可能事实错误&#xff0c;胡说八道&#xff0c;前后不连贯&#xff0c;举例随意且未经考证 甚至 有意欺骗&#xff01;嘻嘻。所以是【胡乱念叨】 文章目录 【胡乱念叨】大模型的“我”参数量和“我”什么是“我”从输入输出的观点看“我”大模型的“我”乱讨论 …...

Flag_AGtivity_clear_top网页编程指南如何退出多activity程序

activity的启动模式:FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONT。 1. 如果已经启动了四个Activity&#xff1a;A&#xff0c;B&#xff0c;C和D。在D Activity里&#xff0c;我们要跳到B Activity&#xff0c;同时希望C finish掉&#xff0c;可以在start…...

克隆centos网卡uuid相同如何修改

在克隆CentOS系统后&#xff0c;网卡的UUID相同会导致网络配置冲突&#xff0c;使得网络无法正常工作。要解决这个问题&#xff0c;你需要为每个克隆的系统生成新的UUID。 以下是解决步骤&#xff1a; 进入原始CentOS系统。 找到网络配置文件的位置&#xff0c;通常在 /etc/s…...

C语言习题~day11

1、C程序常见的错误分类不包含&#xff1a;&#xff08; &#xff09; A.编译错误 B.链接错误 C.栈溢出 D.运行时错误 栈溢出是运行时错误的一种&#xff0c;因此C程序不会将栈溢出错误单独列出来&#xff0c;栈溢出包含在运行时错误中。 因此&#xff1a;选择C 2、关于VS调…...

Ansible——Playbook基本功能???

文章目录 一、Ansible Playbook介绍1、Playbook的简单组成1&#xff09;“play”2&#xff09;“task”3&#xff09;“playbook” 2、Playbook与ad-hoc简单对比区别联系 3、YAML文件语法&#xff1a;---以及多个---&#xff1f;&#xff1f;使用 include 指令 1. 基本结构2. 数…...

多线程学习篇一:启动多线程的三种方式

1. 继承 Thread 类 Slf4j public class MyThread extends Thread {Overridepublic void run() {log.info("MyThread run ...");}public static void main(String[] args) {MyThread myThread new MyThread();myThread.start();} } 2. 实现 Runnable 接口 Slf4j pu…...

【专题】2024跨境出海供应链洞察-更先进供应链报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37665 当前&#xff0c;全球化商业浪潮促使跨境电商行业飞速发展&#xff0c;产业带与跨境电商接轨、平台半托管模式涌现、社交电商带来红利机会以及海外仓不断扩张&#xff0c;这使得产业带外贸工厂、内贸工厂、传统进出口企业和品…...

git submodule

git submodule 是 Git 提供的一种功能&#xff0c;用于在一个 Git 仓库中嵌套另一个 Git 仓库。它可以帮助管理和跟踪外部项目或依赖项&#xff0c;特别是在以下场景中非常有用&#xff1a; 1. 管理外部依赖 当你的项目依赖于其他外部项目或库时&#xff0c;可以使用 git sub…...

【Power Compiler手册】13.UPF多电压设计实现(3)

创建供电端口 要创建电源和地端口,请使用`create_supply_port`命令。 供电端口的名称应该是一个简单的(非层次化的)名称,并且在其定义的层次级别上是唯一的。除非指定了`-domain`选项,否则端口是在当前作用域或层次级别创建的,当前作用域中的所有电源域都可以使用创建的…...

RTX 4090 系列即将停产,RTX 5090 系列蓄势待发

据最新消息&#xff0c;英伟达将于今年10月正式终结其GeForce RTX 4090及RTX 4090D两款旗舰级显卡的生产线。根据行业媒体报道&#xff0c;英伟达及其合作厂商将从下个月开始全面停止这两款显卡的制造。 自2022年10月问世以来&#xff0c;GeForce RTX 4090凭借其无与伦比的GPU…...

【MySQL】使用C语言连接数据库

看到标题&#xff0c;可能会疑惑&#xff0c;我们学习的不是C吗&#xff0c;为什么使用C语言去连接数据库呢??实际上&#xff0c;这两种语言都可以连接数据库&#xff0c;但是C语言提供的API没有进行封装&#xff0c;更有利于我们学习数据库连接。面向API编程&#xff0c;哈哈…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...