我一直在努力对c中的指针有一个坚定的理解。我找到了一个例子,希望通过一些解释可以帮助我和其他人努力理解。
#include<stdio.h>
void f2(int *a, int *b, int *c)
{
printf("%d %d %d\n", *a, *b, *c);
*a = *b + *c;
printf("%d %d %d\n", *a, *b, *c);
}
int main()
{
int a, *b, c;
a = 6;
b = &c;
c = 4;
printf("a: %d %d %d\n", a, *b, c);
a = 10;
*b = 14;
c = 16;
printf("b: %d %d %d\n", a, *b, c);
a = 6;
b = &a;
c = 4;
f2(&c,b,&a);
printf("f: %d %d %d\n", a, *b, c);
return(0);
}
这是输出
a: 6 4 4
b: 10 16 16
4 6 6
12 6 6
f: 6 6 12
以下是我的问题。
答案 0 :(得分:1)
- 为什么* b被声明为int但是b被设置为等于&amp; c。什么是b =&amp; c与将* b声明为int
有关 醇>
b
被声明为一个int指针,可以存储int的地址
通过执行b=&c
,您将获得b
变量c
的内存地址。也就是说,考虑变量c
被分配了内存地址1000H
,然后该地址存储在指针b
中,当我们使用*b
时,显示b
中地址内的值。我们对*b
所做的任何更改都会反映在c
中,c
中所做的更改会反映在*b
- 在下面的块中,* b设置为14,但它仍然给出c的新值,为什么?
醇>
好b
指向c
中的地址,因此当c
中的值发生变化时,*b
显示的值也会发生变化
- 最后,&amp; c作为* a通过f2,即使f2是void函数,其值也会改变。为什么会这样呢?
醇>
c
的地址将传递给函数中的a
。因此,对*a
的值所做的任何更改都将反映在c
您可能需要了解指针以了解更多相关信息。
答案 1 :(得分:1)
*b
被声明为int
?它是b
,它被声明为int*
,这意味着它可以保存int
变量的地址。这就解释了为什么我们可以写b=&c
。 &
是运营商的地址。如果我们将&
放在您的房子前,我们将获取您的地址。那么这意味着,如果我们&c
,则意味着我们获取了名为int
的{{1}}变量的地址。
c
下方的块中设置为14,但它仍然会给出*b
的新值,为什么?因为它的顺序就是这样。 c
。这意味着转到变量*b=14
中的地址,并将该地址的内容设为b
。然后在下一行中明确指出要更改地址位于14
的变量的内容。那就是你看到改变的价值的原因。
b
作为&c
传递f2
,即使*a
是无效函数,其值也会更改。为什么会这样呢?名字怎么样?不要让这个名字让你感到困惑。
f2
f2(&c,b,&a);
void f2(int *a, int *b, int *c)
是一个局部变量 - a
的本地变量,其中包含f2
(c
)变量的地址。与main()
相同,但这次它获得了主要内容b
的内容。 b
与局部变量c
相同,但它从a
得到a
变量的地址。
现在你拥有了所有地址。通过main()
访问它,您可以更改它们指向的位置。副本(通过复制*
,a
和b
c
功能)仍然存在 - 除了向您提供之外,他们不做任何其他事情f2()
。
现在你自己可以理解,main()
函数与更改地址已传递给函数的某些变量没有任何关系。
答案 2 :(得分:1)
为什么* b被声明为int但是b被设置为等于&amp; c。什么是b =&amp; c,将* b声明为int。
表达式 *b
的类型为int
- 对象 b
被声明为指针 int
;它存储另一个int
对象的地址。表达式&c
的计算结果为c
的地址。因此,您需要将c
的地址存储到b
中。完成后,以下情况属实:
b == &c // type pointer to int, both evaluate to address of c
*b == c // type int, both evaluate to value stored in c
从图形上看,你有这样的东西:
+---+
a: | |
+---+ +---+
b: | | ---------> c: | |
+---+ +---+
IOW,表达式 b
和&c
会产生c
的地址,而表达式*b
和c
会产生值存储在 c
中。
n低于* b的块被设置为等于14,但它仍然给出c的新值,为什么?
请注意*b
和c
评估相同的内容,因此编写*b = 14
等同于编写c = 14
。所以基本上,你将14
写到c
,然后立即用16
覆盖它。
最后,&amp; c作为* a传递给f2,即使f2是void函数,其值也会改变。为什么会这样呢?
与b
的情况一样,函数中的参数a
指向 c
,所以
a == &c // type pointer to int, both evaluate to the address of c
*a == c // type int, both evaluate to the value stored in c
在该功能中,您为*a
指定一个新值。由于*a
相当于c
,因此与将新值分配给c
相同。它与函数返回类型无关。