指针作为函数参数详解

news/2024/9/17 3:36:08/ 标签: c语言

一级指针传参

形参指针的指向没有被改变

void test(int* p1)
{*p1 = 8;
}int main()
{int a = 5;int* p = &a;test(p);printf("%d\n", a);
}

输出

8

在这里插入图片描述

总结:

  1. 由代码和上图可知,实参p是个指针,其值为变量a的地址,将其传参给形参p1,即为传地址。
  2. 形参p1接收到实参p传来的地址,又重新申请了一个内存用来存参数的值。由图可知,实参p和形参p1同时指向变量a, 所以在函数test内通过形参p1来改变其所指向的变量a的值,等到函数test调用结束后,形参p1的内存自动被销毁回收,但是实参p还是指向a, 还是可以通过指针p来获取已经被改变的a的值。

形参指针的指向被改变


void test(int* p1)
{int b = 3;p1 = &b;   //改变了指针的指向*p1 = 8;
}int main()
{int a = 5;int* p = &a;test(p);printf("%d\n", a);}

输出

5

在这里插入图片描述
总结:

  1. 由代码执行结果可知,在test函数调用过程中,形参p1的指向内存空间被改变,所以通过指针无法改变a的值。

二级指针传参

先举个一级指针传参的反例

void getMemory(char* p, int num)
{p = malloc(sizeof(char) * num);
}int main()
{	char* str = NULL;getMemory(str, 20);strcpy(str, "hello");printf("%d\n", str);}

上述代码出错
在这里插入图片描述

总结:
1.由图可知,在str将其值(地址)传给getMemory的指针变量p后,p的指向被改变了,但是str的指向没有变,还是指向NULL,所以在strcpy中str为NULL,无法拷贝字符串,程序出错,如何解决上述问题,需要使用二级指针传参,如下面例子所示

void getMemory(char** p, int num)
{*p = malloc(sizeof(char) * num);
}int main()
{	char* str = NULL;getMemory(&str, 20);strcpy(str, "hello");printf("%s\n", str);
}
hello

总结: 使用二级指针,传入的是一级指针的指针(一级指针的地址),当&str传给getMemory时,p和&str都是指向str, 当执行*p=malloc(sizeof(char)*num)后,就相当于str= *(&str)=malloc(sizeof(char)*num), 则str指向了新申请的堆空间,等到getMemory调用结束后,p局部变量被系统销毁, 但是str是main的局部变量,main函数没有结束运行,则str指向的空间还在,所以strcpy可以正常拷贝。


http://www.ppmy.cn/news/1522247.html

相关文章

webpack+lite-server 构建项目示例

首先安装以下库 npm install --save-dev webpack webpack-cli lite-server npm install --save-dev babel-loader babel/core babel/preset-env项目结构 webpack.config.js 配置 const path require("path");module.exports {entry: "./src/index.js",…

5G前传-介绍

1. 引用 知识分享系列一:5G基础知识-CSDN博客 5G前传的最新进展-CSDN博客 灰光和彩光_通信行业5G招标系列点评之二:一文读懂5G前传-光纤、灰光、彩光、CWDM、LWDM、MWDM...-CSDN博客 术语: 英文缩写描述‌BBU:Building Baseba…

华为云征文|Flexus云服务X实例安装ODBC驱动,在ODBC中建立MySQL数据库连接,通过QT连接云数据库

引出 4核12G-100G-3M规格的Flexus X实例使用测评第2弹:Flexus云服务X实例安装ODBC驱动,在ODBC中建立MySQL数据库连接,通过QT连接云数据库 什么是Flexus云服务器X实例 官方解释: Flexus云服务器X实例是新一代面向中小企业和开发…

基于发布-订阅模型的音视频流分发框架

有时需要同时网络推流和把流封装为某格式,或做一些其它操作。这就需要一个分发流的机制,把同一路流分发给多个使用者去操作,下面实现了一个简易的线程安全的音视频流分发框架。代码如下: avStreamHub.h #ifndef STREAMHUB_H #def…

算法专题一: 双指针

目录 前言1. 移动零(easy)2. 复写零(easy)3. 快乐数(medium)4. 盛水最多的容器(medium)5. 有效三角形的个数(medium)6. 和为 s 的两个数字(easy&a…

Docker 进阶构建:镜像、网络与仓库管理

目录 三. docker镜像构建 1. docker镜像结构 2. 镜像运行的基本原理 3. 镜像获得方式 4. 镜像构建 5. Dockerfile实例 6. 镜像优化方案 6.1. 镜像优化策略 6.2. 镜像优化示例:缩减镜像层 6.3. 镜像优化示例:多阶段构建 6.4. 镜像优化示例:使用最精简镜像 四. docke…

网络安全服务基础Windows--第15节-CA与HTTPS理论

公钥基础设施(Public Key Infrastructure,简称 PKI)是指⼀套由硬件、软件、⼈员、策略和程序组成的系统,⽤于创建、管理、分发、使⽤、存储和撤销数字证书。PKI 的核⼼⽬的是通过使⽤公钥加密技术来确保电⼦通信的安全性。PKI 为数…

八月二十九日(day 39)docker6

1.前端(nginx) [rootlocalhost ~]# docker pull nginx //拉取nginx镜像 [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 5ef79149e0ec 2 we…

springboot数据库连接由localhost改成IP以后访问报错500(2024/9/7

步骤很详细,直接上教程 情景复现 一.没改为IP之前正常 二.改完之后报错 问题分析 SQL没开启远程连接权限 解决方法 命令行登入数据库 mysql -u root -p切换到对应数据库 use mysql;设置root用户的连接权限允许其他IP连接数据库 update user set host % whe…

前端技术(六)—— AJAX详解

一、原生 AJAX 1. AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。 AJAX 不是新的编程语言,而是一种将现有的标准组…

C语言程序设计(初识C语言后部分)

留一片空白,随时浓墨重彩。 二十,结构体 结构体类型的声明 结构体初始化 结构体成员访问 结构体传参 1.结构体的声明 1)结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 2&…

上海网站设计-网站手机端制作

随着移动互联网的迅猛发展,越来越多的人通过手机上网,这使得网站手机端的设计和制作变得尤为重要。在这种背景下,上海的网站设计行业迎来了新的机遇与挑战。 首先,网站手机端制作的必要性不容忽视。根据统计数据显示,手…

Flask框架 完整实战案例 附代码解读 【3】

Flask 是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。 前面已经写过项目从新建运行安装到测试部署的全流程,其中有写Flask框架从新建到部署全流程,但是只有部分代码。本篇主要是…

微软发布Phi-3.5 SLM,附免费申请试用

Phi-3 模型系列是Microsoft 小型语言模型 (SLM) 系列中的最新产品。 它们旨在具有高性能和高性价比,在语言、推理、编码和数学等各种基准测试中的表现均优于同类和更大规模的模型。Phi-3 模型的推出扩大了 Azure 客户的高质量模型选择范围,为他们编写和…

通信工程学习:什么是FEC前向纠错

FEC:前向纠错 FEC(Forward Error Correction,前向纠错)是一种增加数据通信可信度的技术,广泛应用于计算机网络、无线通信、卫星通信等多种数据传输场景中。其基本原理和特点可以归纳如下: 一、FEC前向纠错…

ArcGIS出图格网小数位数设置

1、比如要去掉格网后面的小数点,如何设置呢? 2、如下图设置。

linux 下一跳缓存,early demux(‌早期解复用)‌介绍

3.6版本以后的下一跳缓存 3.6版本移除了FIB查找前的路由缓存。这意味着每一个接收发送的skb现在都必须要进行FIB查找了。这样的好处是现在查找路由的代价变得稳定(consistent)了。3.6版本实际上是将FIB查找缓存到了下一跳(fib_nh)结构上,也就是下一跳缓存下一跳缓存…

Flink SQL 中常见的数据类型

Flink SQL 中常见的数据类型 目标 通过了解Flink SQL 中常见的数据类型,掌握正确编写Flink SQL 语句背景 Apache Flink 支持多种数据类型,这些数据类型被用于 Flink SQL 表达式、Table API 以及 DataStream API 中。以下是 Flink SQL 中常见的数据类型: 基本数据类型 Boo…

初识Linux · 进度条

目录 前言: 1 缓冲区和回车换行 2 进度条 前言: 我们目前学习了些许知识,已经足够支持我们写一个非常非常小的项目了,即进度条,相信大家都有过下载游戏,等待游戏更新完成的时候,那么此时就有…

数据结构---单向链表

单向链表 //链表的创建 Link_t *create_link() {Link_t *plink malloc(sizeof(Link_t));if(NULL plink){perror("fail plink");return NULL;}plink->phead NULL;plink->clen 0;return plink; } //头插 int push_link_head(Link_t *plink, DataType data…