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