指针变量作为参数是单向的(c语言,关于形参实参单向值传递!)

:暂无数据 2026-07-18 03:30:02 :0

指针变量作为参数是单向的(c语言,关于形参实参单向值传递!)

其实指针变量作为参数是单向的的问题并不复杂,但是又很多的朋友都不太了解c语言,关于形参实参单向值传递!,因此呢,今天小编就来为大家分享指针变量作为参数是单向的的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

本文目录

c语言,关于形参实参单向值传递!

分两种情况给你对比一下

  1. 函数形参用普通变量,当函数被调用的时候,实参的值被赋值给了形参,函数被调用的时候开辟了内存空间给形参,也就是数据被复制了,然后函数开始处理形参的数据,这个时候和实参的数据是没有任何关系了。当函数结束的时候形参的内存空间是要被释放,或者说删除的,所以对实参啥也没干,只是拿了实参的数据复制了一份,然后对复制的那一份算的很起劲,结果最后删除了,啥也没干。

  2. 函数形参用指针,当函数被调用的时候,实参指针,也就是把地址复制了一份给形参,但是函数中我们用取内容符号’*’对形参指针所指的内容,同时也是实参指针所指的同一份内容进行处理,函数结束的时候形参指针的值是被释放了,可是形参指针,同时也是实参指针所指的内容还在。

    感觉讲的蛮清楚了,不懂再追问。

C语言指针,这两种写法为什么错

第二种是对指针进行的操作。
把指针看成变量的话,无论子函数对指针如何改变,主函数里指针所指向的地址都不会改变。
而第一种则是对指针所指向地址的内容进行改变,这个是永久的。
这需要说明的是,当对非指针类型的变量进行操作的时候,实际的操作区域是在RAM中,是将a这个值复制到RAM中。而对指针变量进行操作是,如*p,是将p的地址0x1000,复制到RAM中,但是当对p所指内容进行操作时,就不是在RAM中了,而是在0x1000那边了。
当子函数退出之后RAM区清空,a当然不会改变,但是*p所指的内容就会有改变了。
不知我有没说清楚,如果还不明白请发站内信

关于指针,形参实参,单向值传递的问题

C语言中有两种传递方式,一个是值传递,另一个是地址(指针)传递。
值传递就是单向传递。它只给从实参传递给形参,而形参经过改变后不会传递给实参,对函数而言,就是参数经过主调用函数传递给了被调用函数,而我们知道,被调用函数除了用return语句返回一个值外,其余的值就不可以返回了。所以说值传递是单向传递。
地址传递则解决了值传递只能返回一个值的尴尬局面。地址传递通过把传入参数的地址以指针方式传递给形参,进而直接对传入参数的内在单元进行修改,所以,这种传递方式可以彻底改变传入参数,不受被调用函数只能返回一个值的限制。
由上面,所以,当你希望通过调用函数并返回多个数值时就要用地址传递的方式,其余就可以选用值传递了。
下面这道题采用值传递显然达不到设计者的要求。
void f(int v,int w)
{
int t;
t=v,v=w,w=t;
}
main()
{
int x=1,y=3,z=2;
if(x》y) f(x,y);
else if (y》z) f(y,z);
else f(x,z);
printf("%d,%d,%d\n",x,y,z);
}
因为上面的程序采用了值传递,而传入的参数经f函数排大小后,不可能再传回去了,这就是单向传递。
希望,编写时候注意。

c指针题说程序停止工作

你的问题,主要出在函数

void insert (treenode *node,int x)

其中语句     node=s; 的本意是将s指针的地址赋值给node指针,这样语句insert(node-》lc,x);

可以达到修改node-》lc的地址作用。

但是,使用指针作为函数参数时,应当注意:

C语言中实现实参变量和形参变量之间的数据传递是单向的“值传递”方式,用指针变量作函数参数时,同样要遵循这一规则,不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。

将实参变量的值传给形参变量,采取的依然是“值传递”方式。

当实参为指针时,只是把所指变量的地址“复制”给了形参变量。

所以insert(node-》lc,x);这一语句,不能修改node-》lc的地址。

解决方法:

使用函数返回值,修改node-》lc或者node-》rc

使用语句:

node-》lc=insert(node-》lc,x);

修改后的代码如下:

#include《stdio.h》

#include《stdlib.h》

typedef struct treenode

{int data;

struct treenode *lc, *rc;}treenode,*startnode;

treenode * insert (treenode *node,int x)

 {    struct treenode *s;

      if( node==NULL)

      {   s=(struct treenode *)malloc(sizeof(struct treenode));

          s-》data=x;

          s-》lc=NULL;s-》rc=NULL;

           node=s;

      }

      else if(x《node-》data)

             node-》lc=insert(node-》lc,x);

      else if(x》node-》data)

             node-》rc=insert(node-》rc,x);

    return node;

 }

struct treenode * search(treenode *node,int x)

{   struct treenode *s;

         s=node;

      while(s)

      {

          if(s-》data==x)  return s;

          if(s-》data》x)    s=s-》lc;

          else  s=s-》rc;

      }

        return NULL;              

}

void inorder(treenode *node)

{

      if(node==NULL)

        return ;

      else

      {

         inorder(node-》lc);

         printf("%d ",node-》data);

         inorder(node-》rc);

      }

}

int main()

{    

    int k;

startnode startnode;

     startnode=NULL;

    scanf("%d",&k);

        while(k!=0)

        {    startnode=insert(startnode,k);

             scanf("%d",&k);

        }

/*       printf("%d",startnode-》data);*/

      inorder(startnode);

       return 0;

}

下图中,左侧为修改过后的程序:

运行实验如下:

指针变量作为参数,函数体只交换参数的地址,为什么a,b,*p1,*p2的值和地址都没发生变化下面是代码

应该是这样:
void swap(int *p1,int *p2)
{int p=*p1;*p1=*p2;*p2=p;}

关于字符指针变量

字符指针变量所指向的内容不能改变,是对的。在这个程序中,“i like china”是字符指针变量所指向的内容,你不能改变“i like china”其中任何字符。但是char *s,是一个字符指针变量,他指向的内存地址是可以改变的。如果你改成*s=’a’;就是你改变了字符指针变量所指向的内容,这是错误的。

用变量或数组元素作为函数的参数,传递的是什么,是单向还是双向传递

  • 数据传递的方向是从实参传到形参,单向传递。

  • 用变量或数组元素作为函数的参数,传递的是“值”,只能由函数调用语句传递给函数,而不能由函数传递回去。
    有什么问题请留言。

关于指针变量作为参数是单向的和c语言,关于形参实参单向值传递!的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

指针变量作为参数是单向的(c语言,关于形参实参单向值传递!)

本文编辑:admin

更多文章:


withdrawal(withdrawal是什么意思)

withdrawal(withdrawal是什么意思)

今天给各位分享withdrawal是什么意思的知识,其中也会对withdrawal是什么意思进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月11日 07:00

根据流程图怎么编写程序(用c语言根据流程图写程序)

根据流程图怎么编写程序(用c语言根据流程图写程序)

大家好,今天小编来为大家解答以下的问题,关于根据流程图怎么编写程序,用c语言根据流程图写程序这个很多人还不知道,现在让我们一起来看看吧!

2026年10月11日 06:00

在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)

在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)

大家好,关于在from子句中可以出现很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于如何在from 子句中嵌套查询下面的语句在access中出错!的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望

2026年10月11日 05:20

countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)

countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)

其实countif函数统计个数怎么用的问题并不复杂,但是又很多的朋友都不太了解countif函数怎么用 详解Excel中countif函数的使用方法,因此呢,今天小编就来为大家分享countif函数统计个数怎么用的一些知识,希望可以帮助到大

2026年10月11日 03:30

正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)

正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)

本篇文章给大家谈谈正则匹配数字之前的字符,以及正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问

2026年10月11日 03:00

register语言学(register语言学)

register语言学(register语言学)

“register语言学”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看register语言学(register语言学)!

2026年10月11日 01:40

系统架构设计师可以直接考吗(学生可以报名系统架构设计师吗)

系统架构设计师可以直接考吗(学生可以报名系统架构设计师吗)

“系统架构设计师可以直接考吗”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看系统架构设计师可以直接考吗(学生可以报名系统架构设计师吗)!

2026年10月11日 01:00

orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)

orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)

大家好,如果您还对orlnsertbootmediinselected不太了解,没有关系,今天就由本站为大家分享orlnsertbootmediinselected的知识,包括我电脑开机显示这个是什么意思or insert boot med

2026年10月10日 23:00

display的用法(display是什么意思 详解display的含义和用法)

display的用法(display是什么意思 详解display的含义和用法)

大家好,如果您还对display的用法不太了解,没有关系,今天就由本站为大家分享display的用法的知识,包括display是什么意思 详解display的含义和用法的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年10月10日 22:00

html全部居中代码(怎么让网页居中显示,html如何让网页居中)

html全部居中代码(怎么让网页居中显示,html如何让网页居中)

大家好,今天小编来为大家解答以下的问题,关于html全部居中代码,怎么让网页居中显示,html如何让网页居中这个很多人还不知道,现在让我们一起来看看吧!

2026年10月10日 21:10

最近更新

withdrawal(withdrawal是什么意思)
2026-10-11 07:00:01 浏览:0
热门文章

标签列表