功能不修改字符数组

问题描述 投票:1回答:2

我刚刚开始学习指针,我试图弄清楚为什么我的代码不起作用。我没有编译错误但代码不是我想要它做的。为什么我没有通过数组的地址?如果我尝试这样做,我得到一个compilation错误:(

#include <stdio.h>

void switch_name(char* name)

{
     name= "testv2";
}

void main()
{
char *name1 = "test_name"; 
printf("%s\n", name1);
switch_name(name1);
printf("%s\n", name1);
}
c parameter-passing
2个回答
1
投票

好吧因为C值得通过。您对局部变量进行了更改(函数name中的swicth_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;
}

这里函数swicth_name得到了char* name1的地址。现在,当您使用*中的一元switch_name取消引用它时,您将字符串文字的地址分配给namemain()变量。那变化保持不变。


0
投票

函数参数是其局部变量。

您可以通过以下方式设想函数调用及其定义

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>
#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;
}

在第一个程序中,您将使用函数重新分配原始指针本身。

在第二个程序中,指针指向的数据使用标准C函数strcpy重新分配。

考虑到根据C标准,没有参数的函数main应声明为

int main( void )
© www.soinside.com 2019 - 2024. All rights reserved.