[英]pointers with strings in c programming
在下面的程序中,我期望printf语句能够打印
a = b,b = a
但是,实际上是印刷
a = a,b = b
当我尝试在函数中打印a
, b
值时,它给出a=b,b=a:::I
不明白为什么pass be reference不会影响实际参数。 我想念什么? 有人可以说明一下吗?
void swap_pointers(char* a, char* b) {
char* tmp = a;
a = b;
b = tmp;
}
int main() {
char* a = "a";
char* b = "b";
swap_pointers(a, b);
printf("a = %s, b = %s", a, b);
return 0;
}
您仅在函数内更改函数参数的值。 如果要更改作为参数传递的指针存储的地址,则需要将指针传递给该指针。
void swap_pointers(char** a, char** b) {
char* tmp = *a;
*a = *b;
*b = tmp;
}
然后你这样称呼它
int main() {
char* a = "a";
char* b = "b";
swap_pointers(&a, &b);
printf("a = %s, b = %s", a, b);
return 0;
}
什么是发生在这里,在功能你是在 B 处设置TMP的值 ,然后在 B 点的 值的值 ,该值通过使用引用操作“*” TMP的。 而当你传递的int参数,要传递的地址和b 与地址运算符“&”的地址 。 因此,您可以在函数中将(*)的值设置为(&)变量的地址。 该变量本身就是一个指针。
指针(“按引用传递”的“引用”)按值传递。 如果要更改引用,则需要通过引用传递引用: (char **a, char **b)
,并具有可以切换的指针到指针到字符的变量。 您的函数将用于交换这些指针的内容; 但是它本身不能交换指针。
#include <stdio.h>
void swap_pointers(char *a, char *b) {
char tmp = *a;
*a = *b;
*b = tmp;
}
int main() {
char a = 'a';
char b = 'b';
swap_pointers(&a,&b);
printf("a = %c, b = %c", a, b);
return 0;
}
嗯,这是一个非常简单且基本的问题,与函数调用有关。
当您执行此操作swap_pointers(a, b);
,
它实际上将a
和b
的副本传递给该函数;
确实会在函数内部交换。
但是,然后您在函数内部不执行任何操作,控件将返回到main
。
结果, main
内部没有进行任何更改。
这就是您所经历的。 解决您的问题的方法是使用引用调用 。
因此,它已经由user2864740在注释中建议,并由Dave在其答案中进行了解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.