热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在子函数中改变指针变量的值的方法

先看一段代码:#include<iostream>voidfoo(char*p){p"afterfoo()";}voidmain(){

先看一段代码:

#include
void foo(char *p)
{
   p = "after foo()";
}    
void main()
{
   char *p = "before foo()";
   foo(p);    
   cout <

}

如果你指望函数foo能帮你改变p的值,那你就错了。因为指针也是变量,它在函数调用过程中也是传值调用的(C中函数参数都是传值调用)。函数foo中的p只是局部变量,它的作用域仅在子函数中。上面这段代码其实和下面这段效果是类似的:

#include
void foo(int i)
{
   i = 1;
}    
void main()
{
   int i = 0;
   foo(i);     
   cout <}

这是foo函数显然不会修改i的值,对于第一段代码的指针,也是同样的道理。都是变量的传值调用,一个是整形变量,一个是指针变量而已。

那么,如何修改代码才能得到我们想要的效果呢?有三种方法。

一、使用return

#include
char* foo()
{
 char* p = "after foo()";
 return p;
}
void main()
{
 char* p = "before foo()";
 p = foo();
 cout<}

二、使用指针引用

#include
void foo(char *& q)
{
   q = "after foo()";
}    
void main()
{
   char *p = "before foo()";
   foo(p);    
   cout <

}

该程序将p的地址传给foo,则p=&q,而p是字符串变量的内存地址,那么&q也是字符串变量的内存地址,则q也是指向该字符串变量所在内存的指针。
简单的说foo中的q这时是p的引用(别名),q和p共享同一个内存空间。这时在foo中修改q指向的内存空间的字符串内容,main中p的值当然也随之变化。

三、使用指向指针的指针

#include
void foo(char ** p)
{
   *p = "after foo()";
}    
void main()

   char **p = "before foo()";  
   foo(p);    
   cout <<*p<}

main中p是指向指针的指针,即它的值的值是指向字符串变量内存的指针的地址,在foo中*p就表示该指针,即字符串变量内存的地址。所以修改*p的值自然可以修改该内存的内容。

下面一段程序使用了同样的原理:

#include
void foo(char ** p)
{
   *p = "after foo()";
}    
void main()
{
   char *p = "before foo()";  
   foo(&p);    
   cout <}

参考:

引用和指针的区别:http://www.iteye.com/topic/69378

c++中指针,指针的引用,指针的指针的区别http://www.cppblog.com/mzty/archive/2006/07/07/9531.html

指针和指针的引用 http://www.cnblogs.com/no7dw/archive/2011/03/19/1988540.html

C语言函数指针参数也是传值调用 http://blog.csdn.net/mantian22/article/details/1357676


推荐阅读
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 结构体在内存中的对齐规则
    一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和。例一:#include<iostream ... [详细]
  • 第3章 感受(一)——3.1. Hello world 经典版
    [回到目录]白话C++第3章.感受Helloworld!,HelloC++,我们来了!3.1.Helloworld经典版毫无疑义,一 ... [详细]
  • CC++如何复制 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 利用空间换时间减少时间复杂度以及以C语言字符串处理为例减少空间复杂度
    在处理字符串的过程当中,通常情况下都会逐个遍历整个字符串数组,在多个字符串的处理中,处理不同,时间复杂度不同,这里通过利用空间换时间等不同方法,以字符串处理为例来讨论几种情况:1: ... [详细]
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼*madebyebhrz*#include#include#include#include#include#include#include ... [详细]
  • C语言的经典程序有哪些
    本篇内容介绍了“C语言的经典程序有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何 ... [详细]
author-avatar
mobiledu2502877091
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有