更新函数中的指针
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()
的pSrc
从func()
改成,需要从[=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
.
的地址
相关概念——按值传递和按引用传递。
我正在向一个指针传递一个更新它的函数。但是,当函数 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()
的pSrc
从func()
改成,需要从[=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
.
相关概念——按值传递和按引用传递。