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

指针赋值在递归函数中不起作用

是因为递归函数的特性导致每次递归调用都会创建一个新的函数栈帧,每个函数栈帧都有自己的局部变量和指针。当在递归函数中进行指针赋值时,只会修改当前函数栈帧中的指针值,并不会影响到其他函数栈帧中的指针。

这种情况下,如果想要在递归函数中改变指针的值,可以通过传递指针的指针或者使用返回值的方式来实现。具体来说,可以将指针的地址传递给递归函数,这样在函数内部就可以通过指针的指针来修改指针的值。另一种方式是将指针作为递归函数的返回值,每次递归调用都返回修改后的指针值,然后在上层函数中进行赋值操作。

举例来说,假设有一个递归函数 recursiveFunc,其中需要修改指针 ptr 的值。可以将 ptr 的地址传递给递归函数,并在函数内部通过指针的指针来修改值:

代码语言:txt
复制
void recursiveFunc(int** ptr) {
    // 修改指针的值
    *ptr = new int(10);
}

int main() {
    int* ptr = nullptr;
    recursiveFunc(&ptr);
    // 此时 ptr 的值已经被修改为 10
    return 0;
}

在这个例子中,通过传递 ptr 的地址给递归函数,函数内部通过 *ptr 来修改指针的值。

需要注意的是,在使用指针的指针或者返回值来修改指针值时,要确保在递归函数中正确地释放内存,以避免内存泄漏。

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

相关·内容

【C 语言】指针间接赋值 ( 直接赋值 和 间接赋值 | 函数中间接赋值 )

文章目录 一、直接赋值 和 间接赋值 二、函数中间接赋值 一、直接赋值 和 间接赋值 ---- 函数体 内部 , 声明普通变量 , 直接赋值 : 直接修改该变量 , 称为 直接赋值 ; 简介赋值...第三次打印 a 变量值 printf("a = %d\n", a); return 0; } 执行结果 : 二、函数中间接赋值 ---- 函数体 内部 , 声明普通变量 ,...如果 获取该变量的地址 , 将该 地址 传递给 函数形参 , 在外部函数 , 通过指针地址 , 修改内存的数据 ; 这同时也是 参数 作为 返回值 的原理 ; 代码示例 : #include #include /* * 函数, 将传入的 p 指针指向的地址 * 对应的 数据 修改为 30 */ void modify_a(int *p) { *...第三次打印 a 变量值 printf("a = %d\n", a); // 调用 modify_a 函数 , 函数修改 a 变量的值 modify_a(p);

3.2K10
  • 指针函数的作用

    一个函数在编译时被分配给一个入口地址,这个函数入口地址被称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。...pfun是指向avg函数函数指针,调用pfun函数指针,就和调用函数avg一样。...从函数返回指针 当我们定义一个返回指针类型的函数时,形式如下: int *fun(参数列表) { ……; return p; } p是一个指针变量,它可以是形式如&value的地址值。...指针数组 数组的元素均为指针变量的数组称为指针数组,一维指针数组的定义形式为: 类型名 *数组名 [数组长度]; 类如: int *p[4]; 指针数组的数组名也是一个指针变量,该指针变量为指向指针指针...指针数组的元素可以使用指向指针指针来引用。

    2.8K20

    C语言-内联函数递归函数指针函数

    前言 这篇文章介绍C语言的内联函数递归函数函数指针指针函数、局部地址、const关键字、extern关键字等知识点;这些知识点在实际项目开发中非常常用,非常重要。...函数返回局部空间的地址问题 子函数: 调用结束后空间会被释放—被系统回收。 总结:子函数不能返回局部变量的地址。...字符串数组和字符串常量定义问题 #include int main() { //p1指向的字符串是程序编译的时候赋值 char *p1="1234567890"; //指针指向字符串常量...0; } 示例2: #include int main() { //p1指向的字符串是程序编译的时候赋值 char *p1="1234567890"; //指针指向字符串常量...递归函数 什么是递归函数? 子函数直接或者间接的方式调用自己的过程叫做递归函数自己调用自己的过程—递归递归函数注意事项:必须有终止条件。

    66320

    【C++】函数重载 ③ ( 为函数指针赋值重载函数 )

    的 返回值 不是 " 函数重载 " 的 判断标准 ; 二义性 : 如果 函数重载 与 默认参数 结合使用 , 出现了二义性 , 编译直接失败 ; 函数指针赋值重载函数 : 根据 函数指针 类型的 参数列表类型...函数指针 章节 , 详细介绍了 函数指针 , 以及 函数指针 与 数组 , 其它指针 结合的 复杂指针如何进行解读 ; " 函数指针 " 是一种 指向函数指针 , 表示的是 函数地址 , 其指向 函数...二、为函数指针赋值重载函数 ---- 1、为函数指针赋值重载函数函数指针 进行赋值时 , 直接将 函数赋值给了 函数指针 ; 如 下面的代码 , 直接将 add 函数赋值给了 函数指针 func_ptr...; int (*func_ptr)(int, int) = add; 如果 代码 定义了多个 add 重载函数 , 那么 使用 重载函数函数指针 进行赋值 , 就需要进行类型匹配了 ; 使用...int main() { // 定义 函数指针 , 将函数地址赋值函数指针 // 对函数指针进行赋值时 , 会根据函数指针的类型匹配 add 函数 // 显然会匹配到 int add(int

    26310

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

    文章目录 一、直接修改 和 间接修改 指针变量 的值 二、函数 间接修改 指针变量 的值 三、函数 间接修改 外部变量 的原理 一、直接修改 和 间接修改 指针变量 的值 ---- 直接修改 指针变量...return 0; } 执行结果 : 二、函数 间接修改 指针变量 的值 ---- 函数 间接修改 指针变量 的值 , 将 指向一级指针 的 二级指针 变量 , 传递到 函数形参 ,... 函数 , 使用 * 符号 , 修改 二级指针 指向的 一级指针 的变量值 ; 注意 : 如果要 修改 一级指针 的值 , 必须 传入 指向 一级指针 的 二级指针 变量 才可以 , 传入一级指针变量...n", p); // 函数 , 简介修改指针的值 modify_pointer(p2); // 打印一级指针地址 printf("%d\n", p);...三、函数 间接修改 外部变量 的原理 ---- 如果要 修改 一级指针 的值 , 必须 传入 指向 一级指针 的 二级指针 变量 才可以 , 传入一级指针变量 , 不能修改一级指针变量值 ; 这是因为

    21.1K11

    【C 语言】指针间接赋值 ( 指针作为 函数参数 的意义 | 间接赋值 代码示例 )

    文章目录 一、指针作为 函数参数 ( 间接赋值 ) 的意义 二、间接赋值 代码示例 一、指针作为 函数参数 ( 间接赋值 ) 的意义 ---- 调用函数时 , 调用 & 取地址 生成 实参 p , 将...指针变量 p 实参 传递给 函数形参 , 函数 借助传入的 指针 可以 实现 与 外部函数 的内存共享 , 函数中使用 *p 修改内存值 , 可以将 运算结果通过 *p 传递出来 ; 指针 作为...函数参数 , 可以实现 主函数 与 被调用子函数 之间 内存交换 ; 下面是逻辑链 : 指针函数参数 ( 间接赋值 ) -> 接口封装与设计 -> 模块划分 -> 软件分层 正是因为有了 间接赋值 ,...才能实现 接口封装与设计 , 进而实现了 模块划分 , 最后实现了 软件分层 ; 使用 指针 ( 一级指针 或 多级指针 ) 作为参数 , 可以更加灵活的 函数 对 传入的 指针 指向的内存数据...: #include #include #include /* * 函数简介修改指针值, 生成字符串 */ void generate_string

    1.2K10

    Python程序设置函数最大递归深度

    函数调用时,为了保证能够正确返回,必须进行保存现场和恢复现场,也就是被调函数结束后能够回到主调函数离开时的位置然后继续执行主调函数的代码。...这些现场或上下文信息保存在线程栈,而线程栈的大小是有限的。 对于函数递归调用,会将大量的上下文信息入栈,如果递归深度过大,会导致线程栈空间不足而崩溃。...Python,为了防止栈崩溃,默认递归深度是有限的(某些第三方开发环境可能略有不同)。下图是IDLE开发环境的运行结果: ? 下图是Jupyter Notebook的运行结果: ?...因此,在编写递归函数时,应注意递归深度不要太大,例如下面计算组合数的代码: ? 如果确实需要很深的递归深度,可以使用sys模块的setrecursionlimit()函数修改默认的最大深度限制。

    2.9K20

    【C 语言】多级指针 ( 函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )

    文章目录 前言 一、函数中生成 二级指针 ( 通过传入的 三级指针 进行间接赋值 ) 二、完整代码示例 前言 如果要 通过 函数形参 间接赋值 修改 n 级指针, 需要向函数传入 n + 1...级指针 形参 ; 一、函数中生成 二级指针 ( 通过传入的 三级指针 进行间接赋值 ) ---- 通过 函数 形参变量 , 间接赋值 返回 生成的 二级指针 函数 ; 如果要生成一个 二级指针 ,...== NULL) { return -1; } // 遍历 二维指针 指向的多个 一维指针 // 并为每个 一维指针 堆内存 分配 20 字节内存...if(p == NULL) { return -1; } // 遍历 二维指针 指向的多个 一维指针 // 并为每个 一维指针 堆内存 分配 20...堆内存 , 分配一块内存空间 // 用于存储 num 个 一维指针 // 每个 一维指针 指向一块内存空间 generate_memory(&p, num); /

    1K10

    Kotlin递归函数

    Kotlin尾递归函数理解 kotlin,如果某个函数的末尾又调用了函数自身,这种就称为尾递归函数。 尾递归函数需要在 fun 前面添加 tailrec。...尾递归函数会使用循环的方式替代递归,从而避免栈溢出。 尾递归不能在异常处理的try、 catch 、 finally 块中使用 。...,且递归调用后没有更多代码,因此可 以将该函数改为尾递归语法。...此时,上面函数可改为如下形式 //使用尾递归函数的语法 tailrec fun factRec(n: Int, total : Int= 1): Int = if (n == 1) total else...factRec(n - 1 , total * n) 优势 与普通递归相比,编译器会对尾递归进行修改,将其优化成一个快速而高效的基于循环的 版本,这样就可以减少可能对内存的消耗。

    80710

    python函数递归VS循环

    for i in range(1,11): print(i) 视频内容 ---- 本节知识视频教程 以下开始文字讲解 一、函数递归的实现 函数是否可以做到类似于循环?...我们可以采用函数递归算法。 什么是递归? 可以理解为定义的函数内部调用函数自己,形成一个回路。既然形成了一个回路,那么必须要有一个退出的方式。而这种退出的方式一般都是采用条件判断来实现的。...(n) 根据以上实际的例子,我们总结出函数递归使用的注意点: 函数的自我调用。...尽可能少用递归,因为非常消耗内存。 出题:阶层的计算,计算10!的结果,采用函数递归的方式进行计算。 如果您没有碰到过阶层的概念,请试着对以下例子进行理解。举例: 0!=1 1!=1*1 2!...=10*9*8*…*2*1 (此题答案本文最后公布) 二、总结强调 1.掌握递归的定义方法。 2.掌握递归的注意事项。 3.掌握递归与for循环的联系与区别。

    1.7K30

    qsort函数指针,及函数解释

    函数指针有何用 函数指针的应用场景比较多,以库函数qsort排序函数为例,它的原型如下: void qsort(void *base,size_t nmemb,size_t size , int(*compar...*类型,代表原始数组,第二个是size_t类型,代表数据数量,第三个是size_t类型,代表单个数据占用空间大小,而第四个参数是函数指针。...这第四个参数,即函数指针指向的是什么类型呢?...int(*compar)(const void *,const void *) 很显然,这是一个接受两个const void*类型入参,返回值为int的函数指针。 到这里也就很清楚了。...在这里函数指针作为了参数,而他同样可以作为返回值,创建数组,作为结构体成员变量等等,它们的具体应用我们在后面的文章中会介绍,本文不作展开。本文只介绍一个简单实例。

    63110

    Python| 函数运用递归方式求解

    解决方案 首先对题目分析,根据题目可用数学等比数列将其值运算得出,由题目可知题目函数可用递归函数求解,先运用函数定义符号def自定义一个新的函数,利用row递归函数将输入值反复循环,再利用for循环对题目中小球下落次数赋值...仍要对sums进行计算,判断返回值时应注意所要打印的函数值是否满足递归函数的定义。...return sums print(sums, height) return row(n+1, sums+(height*2), height/2) # row()表示将递归函数的数值返回输出...,使用递归函数解决问题,要熟悉pythonif条件判断的运用方法。...学习python函数返回的函数意义。 END 主 编 | 王楠岚 责 编 | 沈志坚 能力越强,责任越大。

    1K20

    List.append() Python 不起作用,该怎么解决?

    Python ,我们通常使用 List.append() 方法向列表末尾添加元素。然而,某些情况下,你可能会遇到 List.append() 方法不起作用的问题。...变量重新赋值 Python ,列表是可变对象,也就是说,它们可以通过引用进行修改。...列表作为函数参数另一个导致 List.append() 方法不起作用的常见情况是将列表作为函数的参数传递。 Python 函数参数传递是通过对象引用实现的。...避免重新赋值或引用错误的列表对象。2. 检查列表是否作为参数传递如果你将列表作为函数的参数传递,并且函数内部对列表进行修改,请确保你想要修改的是原始列表,而不是创建一个新的列表对象。3....结论List.append() 方法 Python 通常是一个方便且常用的方法,用于向列表末尾添加元素。然而,当遇到某些情况时,它可能不起作用

    2.5K20

    c给字符数组,字符串指针赋值的方法总结

    写程序的时候,总是搞混,现在总结一下以免以后再犯 char a[10]; 怎么给这个数组赋值呢?谭浩强的书上明确指出,字符数组可以定义时整体赋值,不能再赋值语句中整体赋值。...2、char a[10]; a=”hello”; 这种情况容易出现,a虽然是指针,但是它已经指向堆栈中分配的10个字符空间,现在这个情况a又指向数据区的hello常量,这里的指针a出现混乱...这样赋值给a的是字符串“hello”第一个元素的地址。 还有:不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。 C语言的运算符根本无法操作字符串。...; C语言把这些语句解释为一个指针与另一个指针之间的(非法的)赋值运算。...但是,使用=初始化字符数组是合法的: char str1[10] = “abc”; 这是因为声明,=不是赋值运算符。

    5.8K30
    领券