[英]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
指针指向它。
然后将p
( n
的地址)的值int_pointer
test1()
并更改int_pointer
指向的内存字段的值(并且int_pointer
与p
具有相同的值,因此它会更改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。
var1
和var2
是两个不同的变量,因此它们在内存中有自己的字段。 如果要打印40,则应使var2p
指向var1
,如var2p = &var1
。
test1
修改由指向的可变int_pointer
( main
的n
)。
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.