功能不是一个字符数组

时间:2017-12-26 18:23:02

标签: c parameter-passing

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

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

2 个答案:

答案 0 :(得分: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取消引用时,您可以将字符串文字的地址分配给name main()变量。那变化保持不变。

答案 1 :(得分:0)

函数参数是其局部变量。

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

cin

正如您所看到的,函数中未更改原始变量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);
}

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

在第二个程序中,指针指向的数据使用标准C函数#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应声明为

main