标题:这个题为什么是单项值传递?
只看楼主
编程小猪
Rank: 1
等 级:新手上路
帖 子:33
专家分:4
注 册:2022-10-17
结帖率:100%
已结贴  问题点数:20 回复次数:6 
这个题为什么是单项值传递?
#include <stdio.h>
#include <string.h>
char fun(char *s){
    char a[7];
    s=a;
    strcpy(a,"look");
}
int main(){
    char *p=NULL;
    fun(p);
    puts(p);//输出的是一个不确定的值
    return(0);
}
搜索更多相关主题的帖子: 值传递 char include fun puts 
2022-10-22 12:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
先说两个题外话
“puts(p);//输出的是一个不确定的值” ------ 按标准规定,puts(NULL)属于“未定义行为”
return(0) ------ return是个关键字,它不是函数。就应该正常写作 return 0;

-------------------------------------

int main(){
    char *p=NULL;
    fun(p); // 它就等同于 fun( NULL )
    puts(p); // 它就等同于 puts( NULL )
}
所以你整段代码直接等同于
程序代码:
#include <stdio.h>

int main( void )
{
    puts( NULL );
}


-------------------------------------

对比一下以下两端代码
程序代码:
#include <stdio.h>

void foo( int x )
{
    printf( "地址%p处的int变量值为 %d\n", &x, x );
    x = 123;
    printf( "地址%p处的int变量值为 %d\n", &x, x );
}

int main( void )
{
    int a = 1;
    printf( "地址%p处的int变量值为 %d\n", &a, a );
    foo( a );
    printf( "地址%p处的int变量值为 %d\n", &a, a );
}




程序代码:
#include <stdio.h>

void foo( int* x )
{
    printf( "地址%p处的int变量值为 %d\n", x, *x );
    *x = 123;
    printf( "地址%p处的int变量值为 %d\n", x, *x );
}

int main( void )
{
    int a = 1;
    printf( "地址%p处的int变量值为 %d\n", &a, a );
    foo( &a );
    printf( "地址%p处的int变量值为 %d\n", &a, a );
}
2022-10-22 15:50
编程小猪
Rank: 1
等 级:新手上路
帖 子:33
专家分:4
注 册:2022-10-17
得分:0 
回复 2楼 rjsp
你举的例子我懂,实参传的是变量,所以不能改变;但是实参传的是地址就能改变。
但是我这个例子实参传的是地址啊,形参接受的也是指针,为什么会传不过来啊,是值被释放了??
还是因为传递的是空指针?

专升本备考中!!!
2022-10-23 14:00
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:10 
用指针传参数实质上是把函数以外的空间地址告诉你,使得你能访问这个空间,想要传回数据,需要向其写入你要传出的东西,你什么都不做,怎么传数据。
char fun(char *s){
    char a[7];// 获得函数内部空间
    s=a;//s开始是指向外部空间位置,此句使得他指向了函数内部空间a,自此,失去了与外部空间联系,以后所有操作与外界没关系了,把东西弄丢了就没法用了
    strcpy(a,"look");//复制字符串到a------函数内部空间
}

char fun(char *s){
   
    strcpy(s,"look");
}

int main(){
    char p[100] ; //char *p=NULL;p应该是有确定空间的指针,没有地方怎么存东西
    fun(p);
    puts(p);
    return(0);
}
2022-10-23 23:48
编程小猪
Rank: 1
等 级:新手上路
帖 子:33
专家分:4
注 册:2022-10-17
得分:0 
回复 4楼 jklqwe111
懂了,s原来指向p,后来在函数里又指向了a,所以就和p没关系了,谢谢!!

专升本备考中!!!
2022-10-24 15:24
编程小猪
Rank: 1
等 级:新手上路
帖 子:33
专家分:4
注 册:2022-10-17
得分:0 
回复 4楼 jklqwe111
求教,那这个要怎么改写才能让p得到返回的值呢?

专升本备考中!!!
2022-10-26 19:10
lllyyy3
Rank: 2
等 级:论坛游民
威 望:1
帖 子:24
专家分:20
注 册:2022-10-15
得分:0 
以下是引用编程小猪在2022-10-26 19:10:48的发言:

求教,那这个要怎么改写才能让p得到返回的值呢?

在不改你形参和实参的情况下:
程序代码:
char* fun(char *s){
    char* a = (char*)malloc(sizeof(char) * 7);//动态分配内存
    s=a;
    strcpy(a, "look");
    return s;
}
int main(){
    char* p = fun(p);
    puts(p);
    delete []p;
    return 0;
}


fun函数里要动态分配内存,你原来的写法char a[7]虽然可以给a里放look,但是fun函数结束后子函数申请的内存会回收,main里还是输出不了look。
2022-10-29 00:06



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510409-1-1.html




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

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