更新函数中的指针

Updating pointers in a function

我正在向一个指针传递一个更新它的函数。但是,当函数 returns 时,它的指针 returns 指向它在函数调用之前的值。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

static void func(char *pSrc) {
    int x;
    for ( x = 0; x < 10; x++ ) {
        *pSrc++;
    }

    printf("Pointer Within Function: %p\n", pSrc  );
}

int main(void) {

    char *pSrc = "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson.";

    printf("Pointer Value Before Function: %p\n", pSrc  );

    func(pSrc);

    printf("Pointer Value After Function: %p\n", pSrc  );

    return EXIT_SUCCESS;
}

这是输出

Pointer Value Before Function: 0x100403050
Pointer Within Function: 0x10040305a
Pointer Value After Function: 0x100403050

我期望的是函数后的值与函数内部的值相匹配。

我尝试切换到 char **pSrc,但没有达到预期的效果。

我相信答案很简单,但我是一名正在恢复中的硬件工程师,似乎无法弄明白:-)

函数内部的指针是传递指针的副本。

它们都持有相同的地址但地址不同,因此更改其中一个持有的地址不会影响另一个。

如果你想增加函数内部的指针,改为传递它的地址,就像这样

static void func(char **pSrc) {
    int x;
    for ( x = 0; x < 10; x++ ) {
        (*pSrc)++;
    }    
    printf("Pointer Within Function: %p\n", pSrc  );
}

func(&pSrc);

另外,注意不要修改内容,因为你的指针指向的是字符串字面量,而字符串字面量是不可修改的

C 使用 按值传递 进行函数参数传递。 pSrc 的值只是 main() 中存在的 pSrc 副本 ,而不是 相同的实体 作为 main() 中的 pSrc。这就是为什么在函数 func() 中对 pSrc 所做的任何更改都不会反映在 main()(调用函数)中。

但是,对 *pSrc 的所有更改都将持续。

解决方案:要将main()pSrcfunc()改成,需要从[=13=传递一个指向pSrc的指针(指向指针的指针) =] 并相应地调整数据类型。此外,在这种情况下,请注意,pSrc 应该是可修改的(存在于读写内存中)。正如目前所写,main() 中的 pSrc 不可修改。

当你给一个函数指针时,你就有了你最初拥有的引用值的副本。

然后,如果您修改指针,您正在修改一个副本

如果你想更新原来的,你需要传递一个双指针**,这样你就可以修改原来的指针,传递一个"reference to a reference"(双指针)。

C 按值传递参数,因此它会在您的函数中复制 pSrc,并且您所做的所有更改都会应用到 pSrc 的副本。如果你想改变 pSrc 的值,那么你应该传递一个指向 pSrc 的指针,像这样:

static void func(char **pSrc){ // pointer to char*
     int x;
     for (x = 0; x < 10; x++)
         (*pSrc)++
}

您通过传递 pSrc 来调用 func。您认为您正在传递相同的变量 - 即 func 在更改 pSrc 时将在相同的内存位置上运行。这是错误的。

func 获取 pSrc 的副本。在调用 func 中构建的堆栈帧将拥有自己的 pSrc。修改的是它的版本而不是调用函数的版本。

要让 func 对 main 中的实际变量进行操作,您必须传递 pSrc - &pSrc.

的地址

相关概念——按值传递和按引用传递。