在c语言中,函数掉用,指针做参数,在函数体内对形参的数据改变会影响到实参吗?

但是在这个程序中
#include<stdio.h>
int *f(int *s,int *t)
{
int *k;
if(*s<*t)
{
k=s;
s=t;
t=k;
}
return s;
}
main()
{
int i=3,j=5,*p=&i,*q=&j,*r;
r=f(p,q);
printf("%d,%d,%d,%d,%d\n",i,j,*p,*q,*r);
}

为什么答案是3,5,3,5,5
不是5,3,5,3,5
但是在下面的这个程序中它又是怎么一回事呀?
#include<stdio.h>
int k=7,m=5;
void f(int **s)
{
int *t=&k;
s=&t;
*s=&m;
printf("%d,%d,%d,",k,*t,**s);
}
main()
{
int i=3,*p=&i,**r=&p;
f(r);
printf("%d,%d,%d\n",i,*p,**r);
}
结果为7,5,5,3,3,3

会的,因为多个指针可以指向一个地址,形参改变地址中的内容,实参也会改变,因为调用时你将形参的地址指向实参了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-02-24
指针做参数,形参改变实参的值是会变的。指针在一定意义上可以理解为地址,给指针赋值就相当于把特定地址上的值改变了。
第2个回答  2014-02-24

不会改变实参的值,如果要改变,需要调用地址,即把

int *k;
 if(*s<*t)
 {
  k=s;
  s=t;
  t=k;
 }

 改为

int k;
if(*s<*t)
{
    k=*s;
    *s=*t;
    *t=k;
}

第3个回答  推荐于2016-04-15
#include<stdio.h>
int *f(int *s,int *t)
{
int k;
if(*s<*t)
{
k=*s;
*s=*t;
*t=k;
}
return s;
}
main()
{
int i=3,j=5,*p=&i,*q=&j,*r;
r=f(p, q);
printf("%d,%d,%d,%d,%d\n",i,j,*p,*q,*r);
}
函数里面的除了问题,只是修改了两个形参所存的地址,并没有改变形参所存地址所指向的内存区域的值。追问

但是在下面的这个程序中他的值依然没有改变啦!
#include
int k=7,m=5;
void f(int **s)
{
int *t=&k;
s=&t;
*s=&m;
printf("%d,%d,%d,",k,*t,**s);
}
main()
{
int i=3,*p=&i,**r=&p;
f(r);
printf("%d,%d,%d\n",i,*p,**r);
}
结果为7,5,5,3,3,3

追答

int i=3,*p=&i,**r=&p;

这句来说p指向i,r指向p(r为指针的指针);
f(r);

经过这句,函数中的s也指向p(s也为指针的指针);
int *t=&k; //t指向k
s=&t; //s改变指针,现在s指向t
*s=&m; // *s改变的是t的指向,现在t指向m
故printf("%d,%d,%d,",k,*t,**s);
所输出的内容为k,m,m
printf("%d,%d,%d\n",i,*p,**r);

所输出的内容为i,i,i
故最后总的输出序列为:k,m,m,i,i,i =7, 5, 5, 3,3,3
程序中改变的只是指针变量的值。

本回答被提问者采纳
第4个回答  2014-02-24
应该不会吧,改变的是副本。你写个代码测试下就行了。(错了告诉我下)
相似回答