gpt4 book ai didi

c - 学习中对C指针的疑惑

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:07 24 4
gpt4 key购买 nike

在大学学习C语言时,我遇到了一些关于指针的不确定性,所以我写了我能想到的最简单的代码。

void test1(int *int_pointer) {
*int_pointer = 5;
}

void test2(int *int_pointer) {
int i = 6;
int_pointer = &i;
}

int main(void) {
int n = 8;
int *p = &n;
test1(p);
test2(p);
}

为什么如果我 printf("%i", * int_pointer) 进入 test2 函数它打印出 6 而 printf("%i", * p) 在 main出来 5(而不是 6)?

第二个问题是关于下面的代码。

int main (void) {
int var1 = 10;
int * var1p = & var1;
int var2 = * var1p / 2;
int * var2p = &var2;
var1 = 40;
printf("%i", * var2p);
}

如果我更改 var1 值并且 var2p 指向 var2(等于 * var1p/2),为什么在这种情况下会出现 5 而不是 20?

提前致谢。

最佳答案

第一种情况:

  • 你初始化一个变量 n 并且你创建一个 p 指针指向它。

  • 然后将p的值(n的地址)赋给test1()并更改指向的内存字段的值int_pointer(并且 int_pointerp 具有相同的值,因此它更改 n 的值。

  • 当您调用 test2() 并为您提供相同的地址时,但在函数你改变了局部 int_pointer 的值,所以它会指向本地 i,但 p 保持不变。

这就是为什么在 test2() 函数中打印 6(值 由 int_pointer 指向),并在 main() 中打印 5( p 指向的值)。

第二种情况:

  • 您将 var1 初始化为 10,然后让 var1p 指向它。

  • 然后你把var2初始化为一半,var1p指向的是什么,所以10/2=5。

  • 然后你初始化var2p,所以它会指向var2

  • 之后,您更改了 var1 的值,但 var2 保持不变,所以这就是为什么你得到 5。

var1var2 是两个不同的变量,所以他们有自己的 内存中的字段。如果你想打印 40 你应该 var2p 指向var1,如var2p = &var1

关于c - 学习中对C指针的疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57123830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com