繁体   English   中英

C语言中带有字符串的指针

[英]pointers with strings in c programming

在下面的程序中,我期望printf语句能够打印

a = b,b = a

但是,实际上是印刷

a = a,b = b

当我尝试在函数中打印ab值时,它给出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);

它实际上将ab的副本传递给该函数;

确实会在函数内部交换。

但是,然后您在函数内部不执行任何操作,控件将返回到main

结果, main内部没有进行任何更改。

这就是您所经历的。 解决您的问题的方法是使用引用调用

因此,它已经由user2864740在注释中建议,并由Dave在其答案中进行了解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM