| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3324 人关注过本帖
标题:关于调用函数形参和实参的问题
只看楼主 加入收藏
zzdloveclp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:108
注 册:2016-11-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
关于调用函数形参和实参的问题
都知道实参和形参值传递的单向性,为什么在指针数组中,还可以通过改变形参的值就使得指针的指向发生改变了呢,附上程序。
#include<stdio.h>
#include<string.h>
int main()
{
    void sort(char *name[],int n);//函数声明,排序
    void print(char *name[],int n);//函数声明,输出字符串
    char *name[]={"Follow me","BASIC","Great Wall"};//定义一个指针数组,它的元素分别指向三个字符串的首字符地址
    int n=3;
    sort(name,n);
    print(name,n);
    return 0;
 }
 
 void sort(char *name[],int n)
 {
     char *temp;
     int i=0,j=i+1,k;
     for(;i<n-1;i++)
     {k=i;
     for(;j<n;j++)
     if(strcmp(name[k],name[j])>0)k=j;
     if(k!=i)
     {temp=name[i];name[i]=name[k];name[k]=temp;//就是这里,是怎么改变指向的,不是只能单向传递吗,这里改变指向对实参的影响是什么
     }
     }
}

void print(char *name[],int n)
{
    int i;
    for(i=0;i<n;i++)
    printf("%s\n",name[i]);
    return;
}
搜索更多相关主题的帖子: include return 字符串 元素 
2016-12-21 12:16
zzdloveclp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:108
注 册:2016-11-25
收藏
得分:0 
#include<stdio.h>
int main()
{
    void swap(int *,int *);
    int a=9,b=5,*pointer1,*pointer2;
    pointer1=&a;pointer2=&b;
    if(a>b)swap(pointer1,pointer2);
    printf("min=%d,max=%d",a,b);
    return 0;
}

void swap(int *p1,int *p2)
{
    int *temp;
    temp=p1;p1=p2;p2=temp;
    return;
 } 这个程序是不对的,这两个的区别是什么

[此贴子已经被作者于2016-12-21 12:25编辑过]

2016-12-21 12:23
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:5 
回复 楼主 zzdloveclp
传递的值改变是不影响原实参的值的,因为在子函数中都是创建一个临时变量来存放参数值,函数结束以后就释放,和实参没有任何关系。

可以理解为,实参是原件,形参是复印件。你对复印件做的任何改动都影响不到原件。

但如果实参是原件(比如一本书)的目录,那么复印件也是目录。我对复印件的目录做任何更改依旧影响不到实参(书的目录),但是我有了书读目录,我可以找到实际书的第三章第一节,撕掉,这样对实参(书的目录)指向的地址(整本书)造成了影响。

指针数组可以理解为char **的类型。
只是多了一层目录,原理相同。




2016-12-21 12:42
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
int *temp;老师说过,在调用函数里面交换地址指向是不能实现交换数值的,因为调用函数完毕释放参数后p1,p2就不存在了,但p1,p2里面的内容并没有改变~举个例子,不调用函数,直接用指针在main里交换指针,输出指针值是经过交换的,但输出a,b的值却是没有经过交换的~在调用函数里,就是a,b传递的地址本来就是个定值,是唯一的,在调用函数的时候已经确定了~里面p只不过是借用a,b的地址,其值可以改变罢了~交换两个指针,但a,b的地址却没有发生变化,因此不能用这种方法实现交换~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-21 12:46
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 2楼 zzdloveclp

temp=p1;p1=p2;p2=temp;
p1 p2都是形参,形参的改变对实参没有任何影响

2016-12-21 12:51
zzdloveclp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:108
注 册:2016-11-25
收藏
得分:0 
回复 4楼 九转星河
那麻烦你看一下第一个程序,为什么第一个程序可以呢,这里面的区别是什么
2016-12-21 13:13
zzdloveclp
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:108
注 册:2016-11-25
收藏
得分:0 
回复 3楼 lyl930130
关键是你看第一个程序。他改变的就是目录啊,并不是书的内容,我是看的谭浩强的c程序设计第四版,在书上第279页上说,name【i】和name【k】对换,就是把它们的指向互换,不是换的内容啊,如果对原目录是无影响的,那这个程序是怎么实现的呢?第一个程序和第二个程序不都是换指向吗,为什么第一个对,第二个不对我是能理解的,就是不理解为什么第一个程序是可以的,不知道哪里理解错了。
2016-12-21 13:59
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
看了第一个程序,我有种熟悉的感觉,和我们教材上的题目几乎一模一样~第一个可以~第一个是改变了指针指向,函数传递的是指针的地址,对于指针来说是双向传递的~就像3楼说的一样,不再重复讲了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-21 14:24
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:5 
name是地址列表,name[i]是存放地址的数值。
这样看看:
#include<stdio.h>
main()
{
    char *name[]={"Follow me","BASIC","Great Wall"};
    int n=sizeof(name)/sizeof(char *);
    int i;
    for (i=0; i<n; i++)
        printf("%s\n", name[i]);
}
如果还不明白,再看看:
#include<stdio.h>
main()
{
    char *s1="Follow me";
    char *s2="BASIC";
    char *s3="Great Wall";
    char *name[3];
    name[0] = s1;
    name[1] = s2;
    name[2] = s3;
    int i;
    for (i=0; i<3; i++)
        printf("%s\n", name[i]);
    printf("\n");
    name[0] = s3;
    name[1] = s1;
    name[2] = s2;
    for (i=0; i<3; i++)
        printf("%s\n", name[i]);
}
2016-12-21 14:47
bjut_Allen
Rank: 9Rank: 9Rank: 9
来 自:平乐园工业技术学校
等 级:蜘蛛侠
威 望:8
帖 子:323
专家分:1223
注 册:2016-10-16
收藏
得分:5 
值传递是单向的,但函数传参方式不仅仅只有值传递。数组作为参数时,传参方式变为引用传递,由于数组占据很大的存储空间,如果整个复制数组效率会下降,所以他会复制首地址给形参,函数通过首地址直接访问数组内容。做的排序,自然会改变数组内容。不知道说的对不对,希望大神补充指正。。。

Code is my life.
2016-12-21 19:40
快速回复:关于调用函数形参和实参的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.075473 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved