为什么不是';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";
你必须当警察