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)++
}