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

值传递和地址传递

值传递

我们从下面这段代码开始:

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

http://www.lryc.cn/news/441297.html

相关文章:

  • Docker vs. containerd 深度剖析容器运行时
  • ARM32 base instruction -- blx
  • sql数据库
  • 2024/9/19 408大题专训之五段式指令流水线题型总结
  • Android SPN/PLMN 显示逻辑简介
  • 1.使用 VSCode 过程中的英语积累 - File 菜单(每一次重点积累 5 个单词)
  • 什么是数字化转型升级?
  • JAVA开源项目 校园美食分享平台 计算机毕业设计
  • MyBatis 增删改查【后端 17】
  • 计算机网络(运输层)
  • Linux 线程控制
  • 内网通3.4.3045广告码、积分码
  • MATLAB给一段数据加宽频噪声的方法(随机噪声+带通滤波器)
  • 网安标委发布敏感个人信息识别指南
  • 音视频入门基础:AAC专题(5)——FFmpeg源码中,判断某文件是否为AAC裸流文件的实现
  • 几何 | 数学专项
  • 学习CubeIDE——定时器开发
  • 【Elasticsearch】-图片向量化存储
  • 二叉树(一)高度与深度
  • 梧桐数据库(WuTongDB):MySQL 优化器简介
  • 交通运输部力推高速公路监测,做好结构安全预警,保护人民安全
  • 基于PHP+MySQL组合开发的在线客服源码系统 聊天记录实时保存 带完整的安装代码包以及搭建部署教程
  • NEXT.js 创建postgres数据库-关联github项目-连接数据库-在项目初始化数据库的数据
  • Matlab如何配置小波工具(Wavelet Toolbox)
  • FTP、SFTP安装,整合Springboot教程
  • 24年蓝桥杯及攻防世界赛题-MISC-3
  • 阿里云容器服务Kubernetes部署新服务
  • 记录生产环境,通过域名访问的图片展示不全,通过ip+端口的方式访问图片是完整的
  • 网络安全实训八(y0usef靶机渗透实例)
  • QT信号槽原理是什么,如何去使用它?