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

本文目录
- c语言,关于形参实参单向值传递!
- C语言指针,这两种写法为什么错
- 关于指针,形参实参,单向值传递的问题
- c指针题说程序停止工作
- 指针变量作为参数,函数体只交换参数的地址,为什么a,b,*p1,*p2的值和地址都没发生变化下面是代码
- 关于字符指针变量
- 用变量或数组元素作为函数的参数,传递的是什么,是单向还是双向传递
c语言,关于形参实参单向值传递!
分两种情况给你对比一下
函数形参用普通变量,当函数被调用的时候,实参的值被赋值给了形参,函数被调用的时候开辟了内存空间给形参,也就是数据被复制了,然后函数开始处理形参的数据,这个时候和实参的数据是没有任何关系了。当函数结束的时候形参的内存空间是要被释放,或者说删除的,所以对实参啥也没干,只是拿了实参的数据复制了一份,然后对复制的那一份算的很起劲,结果最后删除了,啥也没干。
函数形参用指针,当函数被调用的时候,实参指针,也就是把地址复制了一份给形参,但是函数中我们用取内容符号’*’对形参指针所指的内容,同时也是实参指针所指的同一份内容进行处理,函数结束的时候形参指针的值是被释放了,可是形参指针,同时也是实参指针所指的内容还在。
感觉讲的蛮清楚了,不懂再追问。
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’;就是你改变了字符指针变量所指向的内容,这是错误的。
用变量或数组元素作为函数的参数,传递的是什么,是单向还是双向传递
数据传递的方向是从实参传到形参,单向传递。
用变量或数组元素作为函数的参数,传递的是“值”,只能由函数调用语句传递给函数,而不能由函数传递回去。
有什么问题请留言。

更多文章:
在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)
2026年10月11日 05:20
countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)
2026年10月11日 03:30
正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)
2026年10月11日 03:00
orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)
2026年10月10日 23:00
display的用法(display是什么意思 详解display的含义和用法)
2026年10月10日 22:00
html全部居中代码(怎么让网页居中显示,html如何让网页居中)
2026年10月10日 21:10





