在大学学习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,而main中的printf("%i", * p)
却打印出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个?
谢谢。
答案 0 :(得分:2)
在第一种情况下:
您初始化变量n
,并制作一个p
指针以指向
它。
然后将p
(n
的地址)的值提供给test1()
并更改由指向的内存字段的值
int_pointer
(和int_pointer
与p
具有相同的值,因此它
更改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。
var1
和var2
是两个不同的变量,因此它们有自己的变量
内存中的字段。如果要打印40张,则应
var2p
指向var1
,就像var2p = &var1
。
答案 1 :(得分:1)
test1
修改int_pointer
(main
的{{1}})指向的变量。
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
而不是局部变量的原因。