void func(char *var)
{
var = "Hello";
}
int main () {
char var[10];
func(var);
printf ("var is %s", var);
}
为什么上述代码在C中不起作用? (printf什么都没显示)。
将var = "hello;"
更改为strcpy(var, "hello");
会修复它:
void func (char *var)
{
strcpy(var, "HELLO");
}
答案 0 :(得分:1)
因为var = "Hello"
修改了参数var
。参数存储在新变量中 - 这不会修改var
中其他变量(也称为main
)的值。
换句话说,由于这不起作用,它不起作用:
void func(int i)
{
i = 7;
}
int main()
{
int i = 0;
func(i);
printf ("var is %i", var);
}
现在,考虑这两个函数(以及一个全局变量):
int five = 5;
void func1(int *p)
{
p = &five;
}
void func2(int *p)
{
*p = five;
}
int main()
{
int i = 0;
printf("%d\n", i); // prints 0 (duh)
func1(&i);
printf("%d\n", i); // still prints 0
func2(&i);
printf("%d\n", i); // prints 5
}
你知道区别吗? func1
修改p
本身(通过将其设置为five
的地址)。 p
是func1
中的局部变量,因此没有理由更改它会影响main
中的任何内容。
另一方面,func2
修改事件p
指向。并且p
指向i
中的本地变量main
- 所以这个 修改了i
中的main
!
现在考虑以下这些功能:
void func3(char *s)
{
s = "Hello";
}
void func4(char *s)
{
strcpy(s, "Hello");
}
字符串文字("Hello"
)在这里是一个红色的鲱鱼,所以我们大多将它从等式中移除:
char hello_string[] = {'H', 'e', 'l', 'l', 'o', '\0'};
char *hello_string_pointer = &hello_string[0];
void func3(char *s)
{
s = hello_string_pointer;
}
void func4(char *s)
{
strcpy(s, hello_string_pointer);
}
func3
无法影响main
中的任何内容,原因与func1
不能 - s
是func3
内的局部变量相同,我们只是在改变s
。
另一方面,func4
调用strcpy
。你知道strcpy
的作用吗?它完全相同:
void func4(char *s)
{
for(int k = 0; k < 6; k++)
*(s + k) = *(hello_string_pointer + k);
}
那里有一些指针算法,但关键是,它修改了* s
指向, and the 5 things after it - which are the first 6 elements of the array in
main`的东西。