首页 > 解决方案 > 如何在函数之间更改指针值

问题描述

我是 C 新手,对如何char *在函数之间更改 a 的值感到困惑。

例如:

#include <stdio.h>
void testing(char *s) {
        s = "hi";
} // testing

int main() {
        char *s = "hello";
        testing(s);
        printf("%s\n", s);
} // main

在这种情况下,s 的值不会改变,"hello"而是被打印出来。

如何更改s,而不必更改任一函数的返回类型或参数?

标签: cpointerschar

解决方案


C 函数调用是严格按值传递的。这意味着当您传递s到时testing,会制作一个本地副本。因此,在函数中分配新值s不会影响 中的值main

但是,由于指针的值被复制,您可以访问它指向的内存。如果s指向非只读内存,您可以将一个缓冲区的内容复制到另一个缓冲区。例如,代替s = "hi";,

strcpy(s, "hi");

main中,该语句char *s = "hello";很可能s指向一个只读缓冲区。要使其成为可写缓冲区,请s改为声明为数组:

 char s[] = "hello";

如果要更改指针的值,而不是它指向的值,则需要传入包含main: 的版本的内存地址s:指向指针的指针。看起来像这样:

#include <stdio.h>
void testing(char **s) {
        *s = "hi";
} // testing

int main() {
        char *s = "hello";
        testing(&s);
        printf("%s\n", s);
} // main

另一种(在这种情况下可能更好)方法是使用返回值而不是输入和输出的参数:

#include <stdio.h>
char *testing(char *s) {
        s = "hi";
        return s;
} // testing

int main() {
        char *s = "hello";
        s = testing(s);
        printf("%s\n", s);
} // main

推荐阅读