如何在不返回函数的情况下增加函数中的“char *”?

How to increment "char *" inside a function without returning it?

提问人:MiguelP 提问时间:3/28/2022 最后编辑:Vlad from MoscowMiguelP 更新时间:3/28/2022 访问量:61

问:

我有这样的东西(简化):

void count(char *fmt)
{
    while (*fmt != 'i')
    {
        fmt++;
    }
    printf("%c %p\n", *fmt, fmt);
}

int main(void)
{
    char *a = "do something";
    char *format;

    format = a;
    printf("%c %p\n", *format, format);
    count(format);
    printf("%c %p", *format, format);
}

给:

d 0x100003f8b
i 0x100003f94
d 0x100003f8b%   

让它工作的唯一方法是做:

char *count(char *fmt)
{
    while (*fmt != 'i')
    {
        fmt++;
    }
    printf("%c %p\n", *fmt, fmt);
    return (fmt);
}

int main(void)
{
    char *a = "do something";
    char *format;

    format = a;
    printf("%c %p\n", *format, format);
    format = count(format);
    printf("%c %p", *format, format);
}

我真的不想要这个,因为我的 count 函数已经返回了我需要的值。我可以做些什么来增加函数内部的格式而不返回它?

C 指针 引用传递 按 值传递 函数定义

评论


答:

2赞 Vlad from Moscow 3/28/2022 #1

通过引用传递指向函数的指针。 在 C 语言中,通过引用传递意味着通过指向对象的指针间接传递对象。因此,取消引用指针后,您将可以直接访问原始对象并可以更改它。

例如

void count(char **fmt)
{
    while ( **fmt != 'i')
    {
        ++*fmt;
    }
    printf("%c %p\n", **fmt, *fmt);
}

并调用函数

count( &format);

评论

0赞 MiguelP 3/28/2022
好的,这有效,但我真的不明白发生了什么。当我不得不使用多个“*”时,我的大脑会出错。你能澄清一下吗?
1赞 Vlad from Moscow 3/28/2022
@MiguelP 在原始函数中,该函数处理传递指针值的副本。更改副本不会反映在原始指针上。通过引用传递指针,通过指向指针的指针,可以访问对原始指针的直接访问,从而取消对参数的引用。它与这两个函数声明的区别相同 void f( int x );和 void f( int *px );第二个函数能够通过指向它的指针 px 将 int 类型的对象更改传递给它。
1赞 Nate Eldredge 3/28/2022
@MiguelP:处理指向任何事物的指针,包括任何其他指针,是成功的 C 编程的一个主要方面,所以是时候开始接受它了。您了解按引用传递(使用指针)的一般工作方式吗?用语言向自己解释为什么会导致 .现在重复该解释,但将 的所有实例替换为 。void incr(long *x) { ++*x; }long y = 5; incr(&y);y ==6longint *
0赞 MiguelP 3/28/2022
@NateEldredge 这其实很有帮助!