C 函数未修改字符数组

C 函数未修改字符数组,c,parameter-passing,C,Parameter Passing,我刚开始学习指针,我正试图找出我的代码不起作用的原因。我没有得到编译错误,但代码并不是我想要它做的。为什么我没有传递数组的地址?如果我尝试这样做,我会得到一个编译错误:( #包括 无效开关名称(字符*名称) { name=“testv2”; } void main() { char*name1=“测试名称”; printf(“%s\n”,名称1); 开关名称(名称1); printf(“%s\n”,名称1); } 因为C是按值传递的。您可以对局部变量(name在函数switch_name()中)

我刚开始学习指针,我正试图找出我的代码不起作用的原因。我没有得到编译错误,但代码并不是我想要它做的。为什么我没有传递数组的地址?如果我尝试这样做,我会得到一个编译错误:(

#包括
无效开关名称(字符*名称)
{
name=“testv2”;
}
void main()
{
char*name1=“测试名称”;
printf(“%s\n”,名称1);
开关名称(名称1);
printf(“%s\n”,名称1);
}

因为
C
是按值传递的。您可以对局部变量(
name
在函数
switch_name()
中)进行更改。要保留更改,请传递
char*
的地址,并直接将字符串文本的地址分配给
char*
(通过取消引用
char**
).例如,这将起作用

#include <stdio.h>

void switch_name(char** name)
{
     *name= "testv2";
}

int main(void)
{
   char *name1 = "test_name"; 
   printf("%s\n", name1);
   switch_name(&name1);
   printf("%s\n", name1);
   return 0;
}
#包括
无效开关名称(字符**名称)
{
*name=“testv2”;
}
内部主(空)
{
char*name1=“测试名称”;
printf(“%s\n”,名称1);
开关名称(&name1);
printf(“%s\n”,名称1);
返回0;
}

在这里,函数
switch_name
获得了
char*
name1
的地址。现在,当您在
switch_name
中使用一元
*
解除对它的引用时,您将字符串文本的地址分配给
main()的
name
变量
。这就是更改保留的原因。

函数参数是其局部变量

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

char *name1 = "test_name"; 
switch_name(name1);

//...

void switch_name( /* char* name */ )
{
     char *name = name1;
     name= "testv2";
}
如您所见,函数中未更改原始变量
name1
。函数中更改的参数是变量
name

如果要在函数中更改原始变量,则必须通过引用传递它

比如说

#include <stdio.h>

void switch_name( char ** name)
{
    *name= "testv2";
}

int main( void )
{
    char *name1 = "test_name"; 

    printf("%s\n", name1);

    switch_name( &name1 );

    printf("%s\n", name1);
}
推荐阅读:“为什么我的代码不起作用”-->代码起作用。“但代码不符合我的要求”-->您希望代码做什么?
#include <stdio.h>

void switch_name( char ** name)
{
    *name= "testv2";
}

int main( void )
{
    char *name1 = "test_name"; 

    printf("%s\n", name1);

    switch_name( &name1 );

    printf("%s\n", name1);
}
#include <stdio.h>
#include <string.h>

void switch_name( char* name )
{
    strcpy( name, "testv2" );
}

int main(void) 
{
    char s[] = "test_name"; 
    char *name1 = s;

    printf( "%s\n", name1 );

    switch_name( name1 );

    printf( "%s\n", name1 );

    return 0;
}
int main( void )