二级指针作为函数参数——可以改变调用函数中传入指针的值(不是指向地址的值哦!)

主要是看这篇文章:

二级指针作为函数参数_二级指针做函数参数-CSDN博客

对里面的程序进行一些修改和补充,调试加更多说明。

1、一级指针情况:

#include"stdio.h"


int my_strlen1(const char* str)
{
    int count = 0;
    int i = 0;

    if (NULL == str)
    {
        return -1;
    }
    printf("strlen1.str : %s\n", str);

    while (*str != '\0')
    {
        str++;
        count++;
    }

    printf("strlen1.str : %s\n", str);

    return count;
}
int main()
{
    const char* str = "hello world";

    printf("%d\n", my_strlen1(str));
    printf("main.str : %s\n", str);

    return 0;
}

因为我的平台是这样的:

可能C语言标准比较旧,所以原文中main函数中定义字符串指针时不需要用常字符串指针,但是我这里不用就报错,所以都改为常字符串指针,对应子函数形参也修改。下同。

在子函数传进来指针后,在改变指针值之前就加一个打印指针指向的值语句。下同。

打印结果:

按照原文最后的说法,这里子函数中的一级指针是主函数中一级指针的副本,其只在子函数内部起作用,子函数内修改这个指针,运行完,主函数的一级指针并未有影响。

2、二级指针

#include"stdio.h"


int my_strlen2(const char** str)
{
    int count = 0;
    int i = 0;

    if (NULL == *str)
    {
        return -1;
    }
    printf("strlen2.str : %x\n", *str);

    while (**str != '\0')
    {
        (*str)++;
        count++;
    }

    printf("strlen2.str : %x\n", *str);

    return count;
}

int main()
{
    const char* str = "hello world";
    printf("main.str : %x\n", str);

    printf("%d\n", my_strlen2(&str));

    printf("main.str : %x\n", str);

    return 0;
}

因为子函数中str是二级指针,所以修改原程序中打印*str时用字符格式%s,那样是打印不出来的。或者说打印是空的。原文中结果就是这样。用打印十六进制值%x代替。

打印结果:

和上面结果对照看,所以,调用子函数确实是改变了主函数的指针值。

3、再次修改第一段代码,更明显看指针值改变:

#include"stdio.h"


int my_strlen1(const char* str)
{
    int count = 0;
    int i = 0;

    if (NULL == str)
    {
        return -1;
    }
    printf("strlen1.str : %x\n", str);

    while (*str != '\0')
    {
        str++;
        count++;
    }

    printf("strlen1.str : %x\n", str);

    return count;
}
int main()
{
    const char* str = "hello world";
    printf("main.str : %x\n", str);

    printf("%d\n", my_strlen1(str));
    printf("main.str : %x\n", str);

    return 0;
}

结果:

调用完后,主函数中的str值并不等于子函数调用完后的str值!

所以,总结一下,一级指针作为函数参数,可以改变对应实参(指针)指向单元的值,而不能改变传入指针本身(地址),二级指针作为函数参数,可以改变对应实参(也是指针)本身的值。原文其实也是这个意思,只不过没强调而已。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/452107.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【功能大全】手机短信验证码一键注册登录流程

目录 发送验证码 注册登录 用户表设计 ​编辑申请腾讯云短信与密钥 找到云短信服务 开通腾讯云短信服务 ​编辑​​​​​创建短信签名 ​编辑​编辑创建短信正文模版​编辑​编辑 等待审核 测试短信​编辑 SDK密钥创建 SpringBoot集成腾讯云短信 pom中导入腾讯云短…

Uni-app跟学笔记(一):新建项目、运行、tabbar、全局配置

文章目录 1)新建项目2)项目运行3)项目结构4)开发规范5)globalStyle全局外观配置6)pages页面配置7)tabbar8)Condition 本博客为 uni-app 此门课的跟学笔记,目的是便于个人…

HTML5:七天学会基础动画网页12

“书接上回”继续对transition补充,在检查中找到ease后,鼠标放到ease前的紫色小方块就可以对运动曲线进行调整,这个曲线叫贝塞尔曲线,这里不做别的补充,不用了解,我们只要知道这个运动方式不只是有简单的匀…

定时执行专家 —— 让工作更高效,生活更便捷

在现代社会,高效的时间管理已经成为我们工作和生活中不可或缺的一部分。为了实现这一目标,我们经常会借助各种工具和软件来辅助我们完成定时任务。今天,我要为大家介绍一款功能强大、操作简便的定时任务执行软件——《定时执行专家》。这款软…

ChromeDriver 122 版本为例 国内下载地址及安装教程

ChromeDriver 国内下载地址 https://chromedriver.com/download 靠谱 千千万万别下载错了 先确认 Chrome 浏览器版本 以 win64 版本为例 那我们下载这一个啊,不要下载错了 下载地址贴在这哈 https://storage.googleapis.com/chrome-for-testing-public/122.0.…

差分----外部执行

概念: 统计学中的差分是指离散函数后的后一项减去前一项的差; 一维数据 输入一个长度为n的整数序列。 接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。 分析: 对l位置上的…

用miniconda建立PyTorch、Keras、TensorFlow三个环境

一、配置清华镜像conda源 由于网络问题,直接使用conda默认的源下载包可能会非常慢。为了解决这个问题,可以配置国内镜像源来加速包的下载。清华大学TUNA协会提供了一个常用的conda镜像源。下面是如何配置清华镜像源的步骤: 1. 配置清华conda…

Day37:安全开发-JavaEE应用JNDI注入RMI服务LDAP服务JDK绕过调用链类

目录 JNDI注入-RMI&LDAP服务 JNDI远程调用-JNDI-Injection JNDI远程调用-marshalsec JNDI-Injection & marshalsec 实现原理 JNDI注入-FastJson漏洞结合 JNDI注入-JDK高版本注入绕过 思维导图 Java知识点: 功能:数据库操作,文…

如何理解Redis中的缓存雪崩,缓存穿透,缓存击穿?

目录 一、缓存雪崩 1.1 解决缓存雪崩问题 二、缓存穿透 2.1 解决缓存穿透 三、缓存击穿 3.1 解决缓存击穿 3.2 如何保证数据一致性问题? 一、缓存雪崩 缓存雪崩是指短时间内,有大量缓存同时过期,导致大量的请求直接查询数据库&#xf…

idea:忽略不要搜索unpackage文件夹

开发vue时搜索关键字,会搜索到编译后的文件,如unpackage。(注意这个是idea工具,和Git忽略是有区别的) File->Settings->Editor->File Types

Ubuntu 安装腾讯会议

1.官网下载 进入腾讯会议下载官网下载腾讯会议Linux客户端 选择x86_64格式安装包下载 若不知道自己的系统架构,输入 uname -a 在命令行结果中查看系统架构信息 2.终端命令安装 cd {你的下载路径} sudo dpkg -i TencentMeeting_0300000000_3.19.0.401_x86_64_default.publi…

2024-03-11,12(HTML,CSS)

1.HTML的作用就是在浏览器摆放内容。 2.HTML基本骨架 head:网页头部,是给浏览器看的代码,例如CSS body:网页主体,是给用户看的代码,例如图片,文字。 title:网页标题 3.标签的两种…

Midjourney绘图欣赏系列(十一)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子,它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同,Midjourney 是自筹资金且闭源的,因此确切了解其幕后内容尚不…

超简单的html+css魔幻霓虹灯文字特效

超简单的htmlcss魔幻霓虹灯文字特效&#xff0c; 效果如下 动态效果&#xff0c;自行查看&#xff0c;创建一个空白的html文件&#xff0c;将下面代码拷贝进去&#xff0c;双击html文件运行即可 <!DOCTYPE html> <html lang"zh-CN"> <head><…

基于Redis实现分布式锁、限流操作(基于SpringBoot)的实现

基于Redis实现分布式锁、限流操作——基于SpringBoot实现 本文总结了一种利用Redis实现分布式锁、限流的较优雅的实现方式本文原理介绍较为通俗&#xff0c;希望能帮到有需要的人本文的demo地址&#xff1a;https://gitee.com/rederxu/lock_distributed.git 一、本文基本实现…

测试用例的设计(2)

目录 1.前言 2.正交排列(正交表) 2.1什么是正交表 2.2正交表的例子 2.3正交表的两个重要性质 3.如何构造一个正交表 3.1下载工具 3.1构造前提 4.场景设计法 5.错误猜测法 1.前言 我们在前面的文章里讲了测试用例的几种设计方法,分别是等价类发,把测试例子划分成不同的类…

第九节:揭开交互的秘密:如何制作原型图

交互设计与用户体验(上) 一、交互、原型的概念及关系 1、什么是交互? 交互(interaction)是指用户与产品之间的互动,即用户输入(input),产品对应给出反馈(Feedback)或输出(Output)的过程。简单可以理解为【交流和互动】。我们把任何两个系统之间的交互都可以看做【对…

P4513 小白逛公园 习题笔记(线段树维护区间最大连续子段和)

传送门https://www.luogu.com.cn/problem/P4513本文参考了董晓老师的博客 这道题着实想了很长时间&#xff08;新手&#xff09;&#xff0c;只能想到一个O&#xff08;mn&#xff09;的dp普通写法&#xff0c;那么遇上区间修改问题改怎么操作呢。答案很明显&#xff0c;线段树…

JVM垃圾收集算法

标记清除算法 1先把垃圾对象标记出来 2然后再进行挨个清除 缺点&#xff1a; 1.清除后的内存空间是不连续的碎片&#xff0c; 2.效率也不高&#xff08;相对于复制算法&#xff0c;复制算法是一次性清除&#xff0c;标记清除是挨个清除&#xff09; 复制算法&#xff08;适…

图论(蓝桥杯 C++ 题目 代码 注解)

目录 迪杰斯特拉模板&#xff08;用来求一个点出发到其它点的最短距离&#xff09;&#xff1a; 克鲁斯卡尔模板&#xff08;用来求最小生成树&#xff09;&#xff1a; 题目一&#xff08;蓝桥王国&#xff09;&#xff1a; 题目二&#xff08;随机数据下的最短路径&#…