为什么不是';t`src`在我从函数中更改它时发生了更改?

为什么不是';t`src`在我从函数中更改它时发生了更改?,c,arrays,string,pointers,pass-by-value,C,Arrays,String,Pointers,Pass By Value,我的节目: #include<stdio.h> #include<conio.h> char* str(char*src);\\declared as function global main() { char src[40]="hello"; clrscr(); puts(src); str(src);\\ function called puts(src);\\does not put changed string?

我的节目:

#include<stdio.h>
#include<conio.h>

char* str(char*src);\\declared as function global
main()
{
    char src[40]="hello";
    clrscr();
    puts(src);
    str(src);\\ function called
    puts(src);\\does not put changed string?
    getch();
    return 0;
}

char* str( char *src)
{
    src="readers";\\changing my source string<--is it changes???
    return src;\\returning source sting
}
为什么
src
没有成为
的“读者”

在您的代码中,
src=“读者”是错误的。你必须像这样尝试

strcpy(src, "readers");
原因是,
C
在传递函数参数时使用传递值。因此,
src
这里是通过值传递的,因此不能从函数内部更改
src
。您可以从函数中更改
*src
。因此,要更改
src
所指向的内容,必须使用
strcpy()

另外,正如先生所提到的,@coolguy没有使用
str()
的返回值,因此
return
语句在这里没有任何影响。

在您的代码中,
src=“readers”是错误的。你必须像这样尝试

strcpy(src, "readers");
原因是,
C
在传递函数参数时使用传递值。因此,
src
这里是通过值传递的,因此不能从函数内部更改
src
。您可以从函数中更改
*src
。因此,要更改
src
所指向的内容,必须使用
strcpy()


另外,正如,@coolguy先生提到的,您没有使用
str()
的返回值,因此
return
语句在这里没有任何影响。

让我们看看代码,好吗

str(src);
函数以
src
作为参数调用。数组
src
的第一个元素的地址被传递给函数
str

char* str( char *src)
在此函数中,
src
是一个指针,指向
main
src
(数组)的第一个元素的地址

src="readers";
return src;
您可以更改
src
指向的位置,并使其指向字符串文本
“readers”
。这不会影响
main
中的数组
src

src="readers";
return src;
返回指针
src
。在您显示的代码段中,它没有任何效果

你真正想要的是

strcpy(src,"readers");
而不是

src="readers";
前者将字符串
“readers”
复制到
src
及其后续字节,从而更改
main
中数组
src
的内容

后者使指针
src
指向一个新的字符串文本
“readers”

让我们看看代码,好吗

str(src);
函数以
src
作为参数调用。数组
src
的第一个元素的地址被传递给函数
str

char* str( char *src)
在此函数中,
src
是一个指针,指向
main
src
(数组)的第一个元素的地址

src="readers";
return src;
您可以更改
src
指向的位置,并使其指向字符串文本
“readers”
。这不会影响
main
中的数组
src

src="readers";
return src;
返回指针
src
。在您显示的代码段中,它没有任何效果

你真正想要的是

strcpy(src,"readers");
而不是

src="readers";
前者将字符串
“readers”
复制到
src
及其后续字节,从而更改
main
中数组
src
的内容

后者使指针
src
指向声明数组内的新字符串文本
“readers”

char src[40]="hello";
将数组传递给函数时

str(src);
它被转换为一个临时对象,该对象是指向数组第一个元素的指针。函数的参数是函数的局部变量,退出函数后会被销毁

您可以按照以下方式想象函数调用及其定义

str(src);

char* str( void )
{
    char * s = &src[0]
    s = "readers";

    return s;
}
char src[40] = "hello";
也就是说,首先,这个局部变量(我将其重命名为s,以区别于原始数组)分配了数组的第一个元素的地址,然后重新分配了字符串文本的第一个元素的地址。字符串文字的第一个元素的地址由函数返回。退出函数后,局部变量(即函数参数)将被销毁

这些操作不会影响原始阵列本身。在函数中处理局部变量s的所有时间

如果希望将字符串文本复制到原始数组中,则必须使用header
中声明的标准C函数
strcpy
。比如说

#include <string.h>

//...

char* str( char *s )
{
    strcpy( s, "readers" );

    return s;
}
但不能在数组定义之后写入以下赋值语句

src = "hello";

您必须逐个元素复制数组,例如,对于通过标准函数strcpy在您声明的数组中包含字符串的字符数组

char src[40]="hello";
将数组传递给函数时

str(src);
它被转换为一个临时对象,该对象是指向数组第一个元素的指针。函数的参数是函数的局部变量,退出函数后会被销毁

您可以按照以下方式想象函数调用及其定义

str(src);

char* str( void )
{
    char * s = &src[0]
    s = "readers";

    return s;
}
char src[40] = "hello";
也就是说,首先,这个局部变量(我将其重命名为s,以区别于原始数组)分配了数组的第一个元素的地址,然后重新分配了字符串文本的第一个元素的地址。字符串文字的第一个元素的地址由函数返回。退出函数后,局部变量(即函数参数)将被销毁

这些操作不会影响原始阵列本身。在函数中处理局部变量s的所有时间

如果希望将字符串文本复制到原始数组中,则必须使用header
中声明的标准C函数
strcpy
。比如说

#include <string.h>

//...

char* str( char *s )
{
    strcpy( s, "readers" );

    return s;
}
但不能在数组定义之后写入以下赋值语句

src = "hello";
你必须当警察