繁体   English   中英

学习期间对C指针的怀疑

[英]doubts about C pointers while studying

在为大学学习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);
}

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

提前致谢。

在第一种情况下:

  • 初始化变量n并使用p指针指向它。

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

  • 当你调用test2()并给你相同的地址,但在函数中你改变了本地int_pointer的值,所以它将指向本地i ,但p保持不变。

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

第二种情况:

  • var1初始化为10,然后使var1p指向它。

  • 然后将var2初始化为一半, var1p指向的是var1p ,所以var1p = 5。

  • 然后初始化var2p ,因此它将指向var2

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

var1var2是两个不同的变量,因此它们在内存中有自己的字段。 如果要打印40,则应使var2p指向var1 ,如var2p = &var1

test1修改由指向的可变int_pointermainn )。

test2修改指针本身。 参数变量是它们所属的函数的本地变量,更改它们对调用者没有影响。

例如,以下内容对调用者没有影响:

void test3(int i) {
    i = 9;
}

test(n);

如果要修改调用者中的指针,则必须将指针传递给指针。

void test4(int **int_pointer_pointer) {
    int *int_pointer = malloc(sizeof(int));
    *int_pointer = 10;
    *int_pointer_pointer = int_pointer;
}

int *int_pointer;
test4(&int_pointer);
printf("%d\n", *int_pointer);
free(int_pointer);

请注意,返回(通常或通过参数)指向局部变量的指针是没有意义的,因为它在函数返回时不再存在。 这就是我使用malloc + free而不是局部变量的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM