我刚刚开始学习指针,我试图弄清楚为什么我的代码不起作用。我没有编译错误但代码不是我想要它做的。为什么我没有通过数组的地址?如果我尝试这样做,我得到一个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
值得通过。您对局部变量进行了更改(函数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()
变量。那变化保持不变。
函数参数是其局部变量。
您可以通过以下方式设想函数调用及其定义
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 )