值传递和地址传递
值传递
我们从下面这段代码开始:
point(char*pt);
void main(){char b[4]={'m','n','o','p'},*pt=b;point(pt);printf("%c\n",*pt);
}
point(char *p){p+=3;
}
这段代码定义了一个函数 point 和一个主函数 main。
-
在 main 函数中,定义了一个字符数组 b 并初始化为 {‘m’, ‘n’, ‘o’, ‘p’},然后定义了一个指针 pt 指向数组 b 的第一个元素。接着调用了 point 函数,并将 pt 作为参数传递。
-
在 point 函数中,参数 p 被增加了 3,这意味着 p 现在指向数组 b 的第四个元素,即字符 ‘p’。
然而,point 函数中的 p 是一个局部变量,对它的修改不会影响 main 函数中的 pt 指针。因此,当 main 函数中的 printf 语句执行时,它将打印出 pt 指针当前指向的值,即数组 b 的第一个元素 ‘m’。
所以,这段代码的输出将是:
m
显然,上面是值传递,下面来看地址传递:
地址传递
在C语言中,当你将一个指针作为参数传递给一个函数时,你实际上是在传递指针的值,也就是它所指向的地址。但是,由于指针本身是一个变量,所以对指针本身的修改(比如改变指针的值,使其指向另一个地址)不会影响原始指针。要让函数能够修改原始指针,你需要传递指针的地址,这样函数就可以修改指针的值。
在你提供的代码中,point 函数接收一个指针作为参数,并且尝试修改这个指针的值。但是,由于C语言的参数传递是按值传递的,所以 point 函数中的 p 只是原始指针 pt 的一个副本,对 p 的修改不会反映到 pt 上。
要让 point 函数能够修改 pt 指针,你需要传递 pt 的地址给 point 函数。这样,point 函数就可以通过解引用这个地址来修改 pt 的值。下面是修改后的代码:
#include <stdio.h>void point(char **p); // 修改函数原型,接收指针的地址int main() {char b[4] = {'m', 'n', 'o', 'p'};char *pt = b;point(&pt); // 传递指针的地址printf("%c\n", *pt); // 打印修改后的指针指向的值return 0;
}void point(char **p) {*p += 3; // 通过解引用修改指针的值
}
在这个修改后的代码中,point 函数现在接收一个指向指针的指针(即 char **p),这样它就可以修改原始指针 pt 的值。在 main 函数中,我们传递了 pt 的地址给 point 函数。在 point 函数内部,我们通过解引用 *p 来修改 pt 指针的值,使其指向数组 b 的第四个元素。
这样,当 main 函数中的 printf 语句执行时,它将打印出修改后的 pt 指针指向的值,即字符 ‘p’。
输出将是:
p
相关文章:
值传递和地址传递
值传递 我们从下面这段代码开始: point(char*pt); void main(){char b[4]{m,n,o,p},*ptb;point(pt);printf("%c\n",*pt); } point(char *p){p3; }这段代码定义了一个函数 point 和一个主函数 main。 在 main 函数中,定义了一个字符数组 b 并…...
Docker vs. containerd 深度剖析容器运行时
随着容器技术的日益普及,Docker 和 containerd 这两个名词频繁出现在我们的视野中。它们都是容器化技术的重要组成部分,但各自扮演着不同的角色。本文将深入探讨 Docker 和 containerd 的区别与联系,帮助大家更好地理解容器技术的底层原理。 …...
ARM32 base instruction -- blx
BLX 带返回和状态切换的跳转指令,此指令只适用 ARMv5T*, ARMv6*, ARMv7。 BLX (immediate) Branch with Link calls a subroutine at a PC-relative address. Branch with Link and Exchange Instruction Sets (immediate) calls a subroutine at a PC-relativ…...
sql数据库
目录 一. 数据库的概念 二. 常用的数据库 三. SQL基础 四. SQL语句的使用 一. 数据库的概念 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据库是存放数据的仓库。它的存储空…...
2024/9/19 408大题专训之五段式指令流水线题型总结
结构冒险: 指令步骤:IF(取指令) ID(译码) EX(执行、计算)M(访存)WB(写回) 其中if和m都需要访问主存取指令和数据,如何解决呢?可以把cache分成数据cache指令…...
Android SPN/PLMN 显示逻辑简介
功能描述 当设备驻网后(运营商网络),会在状态栏、锁屏界面、下拉控制中心显示运营商的名称。 此名称来源有两种: 1、SPN(Service Provider Name) 2、PLMN (Public Land Mobile Name) 功能AOSP默认逻辑SPN提供SIM卡的运营商名称预置在SIM EF中,SIM卡发行运营商名称…...
1.使用 VSCode 过程中的英语积累 - File 菜单(每一次重点积累 5 个单词)
前言 学习可以不局限于传统的书籍和课堂,各种生活的元素也都可以做为我们的学习对象,本文将利用 VSCode 页面上的各种英文元素来做英语的积累,如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的,借此做英语积累再合适不过&a…...
什么是数字化转型升级?
一、什么是数字化转型升级? 数字化转型升级是一个综合性概念,涵盖多个方面的深刻变革。比如说: 技术层面 1、数据化与信息化基础建设 首先是将企业或组织内部的各类业务信息转化为数据形式。例如,传统制造业将生产过程中的设备…...
JAVA开源项目 校园美食分享平台 计算机毕业设计
本文项目编号 T 033 ,文末自助获取源码 \color{red}{T033,文末自助获取源码} T033,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...
MyBatis 增删改查【后端 17】
MyBatis 增删改查 引言 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs (…...
计算机网络(运输层)
物理层、数据链路层以及网络层共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机与主机之间的通信。 实际上在计算机网络中进行通信的真正实体事位于通信两端主机中的进程。 运输层的任务就会是提供运行在不同主机上的应用进程提供直接的通信服务&…...
Linux 线程控制
2. Linux 线程控制 首先,**内核中有没有很明确的线程的概念**,而有**轻量级进程的概念**。当我们想写多线程代码时,可以使用**POSIX线程库**,这是一个 处于应用层位置的库,几乎所有的Linux发行版都默认带这个库&#x…...
内网通3.4.3045广告码、积分码
内网通3.4.3045广告码、积分码 https://download.csdn.net/download/weixin_42120669/89772091...
MATLAB给一段数据加宽频噪声的方法(随机噪声+带通滤波器)
文章目录 引言方法概述完整代码:结果分析结论参考文献引言 在信号处理领域,添加噪声是模拟实际环境中信号传输时常见的操作。宽频噪声可以用于测试系统的鲁棒性和信号处理算法的有效性。本文将介绍如何使用 M A T L A B MATLAB MATLAB给一段数据添加宽频噪声,具体方法是结合…...
网安标委发布敏感个人信息识别指南
9月14日全国网络安全标准化技术委员会秘书处发布《网络安全标准实践指南——敏感个人信息识别指南》 敏感个人信息识别规则: 一旦遭到泄露或者非法使用,容易导致自然人的人格尊严受到侵害、自然人的人身安全受到危害、自然人财产安全受到危害。 注意&am…...
音视频入门基础:AAC专题(5)——FFmpeg源码中,判断某文件是否为AAC裸流文件的实现
音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…...
几何 | 数学专项
日期内容2024.9.19创建 { d > 0 , 递增数列 d < 0 , 递减数列 d 0 ,常数列 \begin{cases} d>0,递增数列\\ d<0,递减数列\\ d0,常数列 \end{cases} ⎩ ⎨ ⎧d>0,递增数列d<0,递减数列d0,常数列 【2010.13】 【1.历年真…...
学习CubeIDE——定时器开发
在b站上学习洋桃电子关于HAL库开发,发现使用CubeIDE是真的简单又方便。 实验现象:使用定时器来产生中断,中断程序是LED灯翻转 在我看来,定时器,是一个从0开始增1(常规),增加到一定…...
【Elasticsearch】-图片向量化存储
需要结合深度学习模型 1、pom依赖 注意结尾的webp-imageio 包,用于解决ImageIO.read读取部分图片返回为null的问题 <dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.7.0-0</versio…...
二叉树(一)高度与深度
高度:从最底层往上数(后序遍历,左右根),更简单(递归) 深度:从上往下数直到有叶子(前序遍历,根左右),较复杂 高度是最大深度 一、求…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
