首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C递归函数使用指针计算更新值,但不更新指针计算的值

是指在递归函数中,通过指针传递参数来实现对变量的更新,但不改变指针本身所指向的地址的值。

在C语言中,可以通过指针参数来传递变量的地址,从而在函数内部对变量进行修改。递归函数是一种特殊的函数,它可以调用自身来解决问题。当递归函数使用指针参数时,可以通过修改指针所指向的地址的值来更新变量的值。

下面是一个示例代码:

代码语言:txt
复制
#include <stdio.h>

void recursiveFunc(int* ptr) {
    if (*ptr <= 0) {
        return;
    }
    
    // 更新变量的值
    *ptr = *ptr - 1;
    
    // 递归调用自身
    recursiveFunc(ptr);
}

int main() {
    int num = 5;
    
    // 调用递归函数
    recursiveFunc(&num);
    
    printf("Updated value: %d\n", num);
    
    return 0;
}

在上面的代码中,递归函数recursiveFunc接受一个指向整数的指针作为参数。在函数内部,通过*ptr = *ptr - 1语句更新了指针所指向的地址的值。递归函数会不断地调用自身,直到变量的值小于等于0为止。

在主函数中,我们定义了一个整数变量num并初始化为5。然后将num的地址传递给递归函数recursiveFunc。最后,我们打印出更新后的变量值。

这种使用指针来更新变量值的递归函数在某些情况下非常有用,特别是当需要在递归过程中保持对变量的修改时。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++函数指针指针函数、返回函数指针函数浅谈

C++函数指针指针函数、返回函数指针函数浅谈 引言 函数指针指针函数C中重要而容易混淆概念,博主将通过两个实例来说明这两个截然不同概念。...而返回函数指针指针函数就更难理解了,放在文章最后来介绍。 函数指针 函数指针是一种特殊 指针,它指向函数入口。...= addfunc(1, 2); cout << "通过直接调用函数进行计算结果:" << result << endl; return 0; } 指针函数 指针函数是一种返回指针...return 0; } 返回函数指针函数 其实在搞懂了函数指针指针函数后,这个概念并不难懂,其实这就是一个复杂一点指针函数,因为他返回函数指针。...先给一个例子: /* *本例是SGISTL源码中一个函数,比普通返回函数指针函数要更复杂一点 *因为本例中函数参数也是一个函数指针 */ void (* set_malloc_handler

1.5K10

数据库中计算更新方法

在做项目时,经常在项目中会遇到有些是通过其他表经过计算得来,然后将计算结果保存到数据库中。比如在一个休假系统中,一个员工每年已休天数就是一个计算,通过SUM员工所有有效休假申请单可获得。...1.基于现有的计算,在更新相关数据时加减该计算。 在需要计算数据量比较大情况下一般采用这种方法。...2.每次更新相关数据时,根据所有数据重新计算。 在计算量较小是使用这种方法。比如我们订单系统中,订单总金额就是汇总订单明细金额,如果删除了或者增加了订单明细,那么只需要重新汇总即可。...第二种方法在每次更新数据时重新计算,需要一定计算量,所以不能用于大数据量计算,优点是不用担心数据不一致问题,保证计算列是正确。 如果使用第一种方法,如何避免数据不一致呢。...一个常用方法是建立一个定时任务,在数据库闲时使用全量数据重新计算每天发生更改数据计算,然后用这个和数据库中该列进行比较,如果不相同,那么就通知管理员,人为清查数据不一致原因,将数据修复。

87820

C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 | 在函数中 间接修改 指针变量 | 在函数中 间接修改 外部变量 原理 )

文章目录 一、直接修改 和 间接修改 指针变量 二、在函数中 间接修改 指针变量 三、在函数中 间接修改 外部变量 原理 一、直接修改 和 间接修改 指针变量 ---- 直接修改 指针变量... , 就是为其赋值一个地址 , 使用 & 取地址符 , 将变量地址赋值给指针变量 , 或者使用 malloc 函数分配内存赋值给 指针变量 ; // 将变量地址赋值给一级指针 p...return 0; } 执行结果 : 二、在函数中 间接修改 指针变量 ---- 在 函数 中 间接修改 指针变量 , 将 指向一级指针 二级指针 变量 , 传递到 函数形参 中 ,...在 函数中 , 使用 * 符号 , 修改 二级指针 指向 一级指针 变量值 ; 注意 : 如果要 修改 一级指针 , 必须 传入 指向 一级指针 二级指针 变量 才可以 , 传入一级指针变量...函数外部 变量 , 必须传入 指向该变量 指针才可以 ; 代码示例 : #include #include /* * 函数中简介修改指针 */ void

20.9K10

C++返回指针函数 | 按字母顺序由小到大输出

C++指向函数指针函数参数 学到这里读者应该知道在C语言中,函数指针变量常见用途之一是作为函数参数,将函数名传给其他函数形参,这样可以在调用一个函数过程中根据给定不同实参调用不同函数,...C++返回指针函数C++中,一个函数可以带回一个整型、字符、实型 等,也可以带回指针数据,即地址,带回类型是指针类型,返回指针函数简称为指针函数。 ...定义指针函数一般形式为  类型名 *函数名(参数列表); C++指针数组 在C++中,如果一个数组,其元素均为指针类型数据,该数组称为指针数组,也就是说,指针数组中每一个元 素相当于一个指针变量,它都是地址...(name,number);//调用print函数    return 0; //函数返回为0;  }  void sort(char *name[],int number)//自定义排序函数  {...C++返回指针函数 | 按字母顺序由小到大输出 更多案例可以go公众号:C语言入门到精通

1.4K2118

golang 中函数使用返回与指针返回区别,底层原理分析

变量内存分配与回收 堆与栈区别 变量内存分配逃逸分析 检查该变量是在栈上分配还是堆上分配 函数内变量在堆上分配一些 case 函数使用指针返回时性能差异 其他一些使用经验 总结 变量内存分配与回收...上文介绍了 Go 中变量内存分配方式,通过上文可以知道在函数中定义变量并使用返回时,该变量会在栈上分配内存,函数返回时会拷贝整个对象,使用指针返回时变量在分配内存时会逃逸到堆中,返回时只会拷贝指针地址...那在函数中返回时是使用还是指针,哪种效率更高呢,虽然有拷贝操作,但是返回指针会将变量分配在堆上,堆上变量分配以及回收也会有较大开销。...其他一些使用经验 1、有状态对象必须使用指针返回,如系统内置 sync.WaitGroup、sync.Pool 之类,在 Go 中有些结构体中会显式存在 noCopy 字段提醒不能进行拷贝;...,如果对象生命周期存在比较久或者对象比较大,可以使用指针返回; 3、大对象推荐使用指针返回,对象大小临界需要在具体平台进行基准测试得出数据; 4、参考一些大开源项目中使用方式,比如 kubernetes

5K40

C++】C++ 引用详解 ③ ( 函数返回不能是 “ 局部变量 “ 引用或指针 | 函数 “ 局部变量 “ 引用或指针函数返回无意义 )

一、函数返回不能是 " 局部变量 " 引用或指针 1、引用通常做右 之前使用 引用 时 , 都是作为 右 使用 , 引用只在 声明 同时 进行初始化时 , 才作为左 , // 定义变量 a...2、函数返回特点 函数 返回 几乎很少是 引用 或 指针 ; 函数 计算结果 经常是借用 参数中 地址 / 引用 进行返回 , 函数 返回 一般返回一个 int 类型 , 如果...int 为 0 就是成功 , int 为其它数值 , 就是错误码 ; 3、函数 " 局部变量 " 引用或指针函数返回无意义 如果 想要 使用 引用 或 指针函数计算结果 , 一般都是将..., 该 指针 是 局部变量 指针 ; 上述两个函数是无意义 , 获取到 函数 返回 " 局部变量 " 引用 或 指针 , 然后获取地址 , 发现获取都是随机 , 都是无意义 ; num21...= -858993460 , *num3 = -858993460 代码示例 : // 包含 C++ 头文件 #include "iostream" // 使用 std 标准命名空间 // 该命名空间中

32020

C++奇迹之旅:内联函数和auto关键推导和指针

inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确说法,取决于编译器内部实现)、不是递归、且频繁调用函数采用inline...(关于迭代器这个问题,以后会讲,现在提一下,没办法讲清楚,现在大家了解一下就可以了) 指针nullptr(C++11) C++98中指针 在良好C/C++编程习惯中,声明一个变量时最好给该变量一个合适初始...不论采取何种定义,在使用指针时,都不可避免会遇到一些麻烦,比如: void f(int) { cout << "f(int)" << endl; } void f(int*) { cout...在使用nullptr表示指针时,不需要包含头文件,因为nullptr是C++11作为新关键字引入。 2....在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占字节数相同。 3. 为了提高代码健壮性,在后续表示指针时建议最好使用nullptr

14010

C语言函数传递了指针没有被修改原因及解决方法

C语言函数指针参数值为什么不变C语言函数中传递了指针作为参数,确切来说是传递了指向变量内存地址作为参数,可经过函数修改之后,该指针指向变量为什么不会被修改?...就像下方这个函数:void test(int *x){ *x++;}这是为什么呢?...这个跟运算符优先级也没有关系,像上面这样*x++表达式中,并不会被优先计算x++,即不会先进行内存地址自增运算。下面的实例中将探讨这一点。...实例代码该实例输出了三个变量内存地址,前两个是一样,即通过*x++运算,变量指向内存地址并没有发生改变,但是如果是通过指针自增运算,比如z++,则内存地址会发生改变。...):61fe1461fe1461fe18解决方法将x++修改为:x = *x + 1;原文:C语言函数传递了指针为什么没有被修改免责声明:内容仅供参考,不保证正确性!

32921

C 语言】文件操作 ( ftell 函数 | 使用 ftell 函数获取当前指针位置 | 通过 ftell 计算文件大小 )

文章目录 一、ftell 函数 二、使用 ftell 函数获取当前指针位置 三、通过 ftell 计算文件大小 一、ftell 函数 ---- ftell() 函数作用是 获取文件 当前指针位置 相对于...文件首地址 偏移字节数 ; ftell 函数原型 : #include long ftell(FILE *stream); ftell 使用场景 : 随机方式存取文件时 , 使用...fseek 函数来回移动指针 , 不容易确定当前指针位置 , 通过调用 ftell 函数确定指针位置 ; 二、使用 ftell 函数获取当前指针位置 ---- 代码示例 : 第一次打印指针位置 : 刚打开文件...fseek(p2, 0, SEEK_END); // 使用 ftell 函数获取当前指针位置 int location = ftell(p2); // 通过读取当前文件指针位置...// 使用 ftell 函数获取当前指针位置 location = ftell(p2); // 查看指针是否恢复 ★★★ printf("location = %d\n

1K10

C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入参数要求 | 参数作返回 )

如果要在函数中修改 N 维指针指向 : ① 使用指针作为参数 : 必须传入 N + 1 维 ( 及以上 ) 指针参数 , 才可以修改 N 维指针指向 ; ② 使用引用作为参数 : 可以传入 N 维指针引用作为参数...参数使用语言环境 : 引用类型参数只能在 C++ 环境中使用 , 指针类型参数可以用于 C / C++ 两种语言环境中 , 因此很多基础库 如 FFMPEG , OpenSL ES 等使用都是指针类型参数...C 语言中参数 分类 : ① 普通变量参数 : C 语言中 普通变量 ( 非指针变量 ) 作为参数 , 只能进行传递 , 不能通过参数返回结果 ; ② 指针变量参数 : C 语言中 , 如果要让函数参数可以将结果返回...C++ 中引用参数 : C++ 在 C 语言基础上扩展了 引用 数据类型 , 使用引用可以替代上面的指针作为参数情况 , 使参数具有返回结果能力 ; 3 ....引用作为参数和返回 ---- 引用作为参数和返回 : 如果是引用作为参数 , 修改 N 维指针指向地址 , 那么需要传入 N 维指针引用即可 ,在函数中修改该引用 , 即可修改外部被引用变量

2.1K20

以下是一个复杂 C 语言代码示例,展示了如何使用递归函数计算斐波那契数列: ```c #include 递归函数计算斐波那契数列 int fibonacci(int

以下是一个复杂 C 语言代码示例,展示了如何使用递归函数计算斐波那契数列: #include // 递归函数计算斐波那契数列 int fibonacci(int n) {...main() { int num; printf("请输入一个正整数: "); scanf("%d", &num); printf("斐波那契数列前...i = 0; i < num; i++) { printf("%d ", fibonacci(i)); } return 0; } 上述代码中,我们定义了一个递归函数...fibonacci,用于计算斐波那契数列第 n 项。...在 main 函数中,用户可以通过输入一个正整数来指定要计算斐波那契数列项数。然后,使用循环来打印出斐波那契数列前 num 项。

24730

疯狂数据结构-栈-Java

获取栈大小(getSize):返回栈中元素个数。 应用分析 实际应用分析 栈应用相当广泛,例如函数调用栈、浏览器前进后退功能和计算后缀 表达式求值等等。...递归算法:递归算法通常使用栈来实现,因为递归函数调用过程本质上也是一 个栈结构,每次递归调用都会将当前函数局部变量和返回地址保存在栈上。...如果栈为空,则需要进行 相应处理,如报错或者返回特定。出栈时要确保栈指针指向栈顶元素, 取出栈顶元素后,栈顶指针更新。...当不再需要使用栈时, 需要及时释放栈所占用内存空间,以避免内存泄漏问题。 栈大小限制:栈大小是有限,具体取决于操作系统和计算机硬件限制。 在使用过程中,需要确保栈不会溢出。...在 push() 方法中,新增了对栈最小更新操作, 以便在出栈时更新最小。在 pop() 方法中,将出栈元素与最小 进行比较,如果相等,则更新最小

22640

模拟C语言库函数strlen实现

模拟C语言库函数strlen实现 1.0直接使用while循环 1.0 参考代码 2.0 不创建变量使用递归计算字符长度 2.1 参考代码 3.0 参考库函数模拟实现strlen 3.1const 作用...("%d", ret); } 之后来编写my_strlen实现 由于我们要计算字符串长度是整形所以返回是int,形参部分传过来了一个数组地址所以我们选择用指针接收地址,这样我们函数头就写好了。...count;//然后我们返回他字符长度 } 2.0 不创建变量使用递归计算字符长度 前面我们完成strlen基本实现现在来试试一试递归方法 递归2个条件 1、 存在限制条件,当满足这个条件递归就不在继续.../是不是就越来越接近限制条件 { return 0;//但不满足条件就返回0,停止递归 } } 3.0 参考库函数模拟实现strlen 我们来参考一下库函数C/C++官网cplusplus...作用 还多了const 修饰指针 const 意思是让char* p 修饰为常变量 限制p 这个指针无法改变,否则报错 所以我们也将代码优化一下 3.2 参考代码 #include

10910

理解DOM Diff算法

本文以 Vue 原码中 DOM diff 算法为例,介绍一下这个算法实现原理。 虚拟 DOM 是用 JavaScript 模拟 DOM 结构,通过计算出最小变更,操作 DOM 结构,更新视图。...patch 函数,当数据发生变化时,set 方法会调用 dep.notify 通知所有订阅者 Watcher,订阅者就会调用 patch 函数,给真实 DOM 打补丁,更新视图。...== vnode.text) { // 都有文本,但不相同,就使用 vnode(新文本 nodeOps.setTextContent(elm, vnode.text...如果使用数组索引作为 key,当对数组排序然后重新渲染时,节点索引很可能会发生改变,索引发生改变导致 key 也会发生改变,节点还是原来节点,但是它 key 却发生了变化,这会导致 Vue...因此不推荐使用索引作为 key。更不推荐使用随机数(比如 Math.random)作为 key,当组件更新时,随机数会跟着变化,导致 key 每次都不一样。

1K10

至少有 K 个重复字符最长子串----双指针篇5,滑动窗口篇4,新人理解递归必看篇!!

递归要点: 重点:我们在调用递归函数时候,把递归函数当做普通函数(黑箱)来调用,即明白该函数输入输出是什么,而不用管此函数内部在做什么。 下面是详细讲解。...递归最基本是记住递归函数含义(务必牢记函数定义):本题 longestSubstring(s, k) 函数表示就是题意,即求一个最长子字符串长度,该子字符串中每个字符出现次数都最少为 k。...而递归函数到底怎么一层层展开与终止,不要用大脑去想,这是计算机干的事。我们只用把递归函数当做一个能解决问题黑箱就够了,把更多注意力放在拆解子问题、递归终止条件、递归函数正确性上来。...当我们使用指针时候: 右端点往右移动必然会导致字符类型数量增加(或不变) 左端点往右移动必然会导致字符类型数量减少(或不变) 当然,我们还需要记录有多少字符符合要求(出现次数不少于 k),当区间内所有字符都符合时更新答案...,需要更新arr数组 fill(cnt, cnt + 26, 0); //tot:当前[i,j]区间内字符类型数量 //sum:满足出现次数大于k字符种类个数 for

64120

深入探讨 `constexpr` 和 `const` 区别

const:用于定义运行时常量和不可变。它仅表示变量在初始化后不可改变,但不保证在编译期计算。...循环和条件语句:constexpr 函数可以包含循环和条件语句,但这些语句必须能够在编译时完全展开和计算递归:constexpr 函数可以是递归,但递归深度必须在编译时确定。...const 修饰函数 运行时计算: const 修饰函数返回在运行时计算。 const 仅表示函数返回是不可变但不保证在编译期计算。...函数要求: const 修饰函数没有特别的要求,可以有副作用。 函数体可以包含任意合法 C++ 代码。 使用场景: 用于返回一个不可变。 适用于需要在运行时计算场景。...const int x = 10; 修饰指针: const 可以修饰指针,表示指针本身或指针指向不可变。

13210

二叉树前序遍历 、二叉树最大深度、平衡二叉树、二叉树遍历【LeetCode刷题日志】

一、二叉树前序遍历 方法一:全局变量记录节点个数 计算节点数: 函数TreeSize用于递归计算二叉树中节点数。如果树为空(即根节点为NULL),则返回0。...它首先将当前节点存储在数组a中,然后递归地遍历左子树和右子树。注意,这里直接使用了全局变量i来更新数组索引。...它首先使用TreeSize函数计算节点数,然后动态分配一个足够大整数数组来存储结果。接下来,它调用_prevOrder函数来执行前序遍历,并填充数组。...它接受三个参数:当前节点 root、用于存储遍历结果数组 a 和一个指向整数指针 pi(表示当前数组索引)。函数首先将当前节点存储在数组 a 相应位置,然后递增索引 pi。...char val; // 节点 } TNode; // 创建一个二叉树函数,a是包含节点字符串,pi是指向当前要处理字符索引指针 TNode

13610

深入理解计算机系统(3.7)------过程(函数调用原理)

上篇博客我们讲解了计算机汇编语言是如何实现循环结构。本篇博客我们将介绍汇编语言中过程实现方式。   过程在高级语言中也称为函数,方法。...为此必须采用一组统一寄存器使用惯例,所有的过程都必须遵守,包括程序库过程。   假如没有这些规矩,比如在调用一个过程时,无论是调用者还是被调用者,都可能更新寄存器。...假设调用者在%edx中存了一个整数值100,而被调用者也使用这个寄存器,并更新成了1000,于是悲剧就发生了。...对于递归情况,计算 n-1,将这个存储在栈上,然后调用函数自身(第10~12行),在代码完成部分,我们可以假设:   ①、寄存器%eax保存这(n-1)!...对于终止条件和递归调用,代码都会继续到完成部分(第15~17行),恢复栈和被调用者保存寄存器,然后在返回。   所以我们看到递归调用一个函数本身与调用其它函数是一样

1.5K50
领券