Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 更新函数中的指针_C_Function_Pointers_Pass By Value - Fatal编程技术网

C 更新函数中的指针

C 更新函数中的指针,c,function,pointers,pass-by-value,C,Function,Pointers,Pass By Value,我正在向指针传递一个更新它的函数。但是,当函数返回指针时,它将返回到函数调用之前的值 这是我的密码: #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", p

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

这是我的密码:

#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;
}
我所期望的是函数后的值与函数中的值相匹配

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


我确信答案相当简单,但我是一名正在恢复的硬件工程师,似乎无法理解:-)

函数中的指针是传递的指针的副本

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

如果要在函数中增加指针,请改为传递其地址,如下所示

static void func(char **pSrc) {
    int x;
    for ( x = 0; x < 10; x++ ) {
        (*pSrc)++;
    }    
    printf("Pointer Within Function: %p\n", pSrc  );
}
另外,请注意不要修改内容,因为指针指向字符串文字,并且不能修改字符串文字。

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

但是,
*pSrc
的所有更改都将保持不变


解决方案:要从
func()
更改
main()
pSrc
,需要从
main()
传递指向
pSrc
(指向指针的指针)的指针,并相应地调整数据类型。此外,在这种情况下,请注意,
pSrc
应该是可修改的(存在于读写存储器中)。正如当前编写的那样,
main()
中的
pSrc
是不可修改的。

当您给出一个指向函数的指针时,您有一个原始参考值的副本

然后,如果修改指针,就是在修改副本


如果要更新原始指针,需要使用双指针传递它,这将允许您修改原始指针,传递“引用到引用”(双指针)。

C通过值传递参数,因此它在函数内复制pSrc,您所做的所有更改都将应用于pSrc的副本。如果要更改pSrc的值,则应向pSrc传递一个指针,如下所示:

static void func(char **pSrc){ // pointer to char*
     int x;
     for (x = 0; x < 10; x++)
         (*pSrc)++
}
static void func(char**pSrc){//指向char的指针*
int x;
对于(x=0;x<10;x++)
(*pSrc)++
}

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

func
获取pSrc的副本。调用
func
内置的堆栈框架将有自己的
pSrc
。修改的是它的版本,而不是调用函数的版本

要让
func
对main中的实际变量进行操作,您需要传递
pSrc
-
&pSrc
的地址


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

您需要传递
char*pSrc
的地址,以便修改
pSrc
指向的内容(保留
char*pSrc
,将其作为
&pSrc
传递,并让函数接受一个
char**
。C也使用按引用传递,不是吗?@Ryker是这样吗?请怎么做?至少据我所知,它不是。我认为正确的说法是,除了数组和函数之外,C总是按值传递参数。(,例如)我理解你的答案的要点,对它没有任何实际问题,只有这一点:)@Ryker我明白你的意思,但我不同意你的话。对于数组,参数本身也只通过值传递。你能从函数内部更改数组的基址(考虑双指针)吗?:-)出于同样的原因,你是说如果我传递一个指向一个结构的指针,那么该结构的成员的值就包含在内了吗?它们不是,但是可以通过引用该结构的位置来访问。下面是更详细的内容。
func(&pSrc);
static void func(char **pSrc){ // pointer to char*
     int x;
     for (x = 0; x < 10; x++)
         (*pSrc)++
}