指针示例

时间:2017-12-11 19:56:03

标签: c pointers

我一直在努力对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

以下是我的问题。

  1. 为什么* b被声明为int但是b被设置为等于&amp; c。什么是b =&amp; c与将* b声明为int。
  2. 相关
  3. 在下面的块中,* b设置为14,但它仍然给出c的新值,为什么?
  4. 最后,&amp; c作为* a通过f2,即使f2是void函数,其值也会改变。为什么会这样呢?

3 个答案:

答案 0 :(得分:1)

  
      
  1. 为什么* b被声明为int但是b被设置为等于&amp; c。什么是b =&amp; c与将* b声明为int
  2. 有关   

b被声明为一个int指针,可以存储int的地址

通过执行b=&c,您将获得b变量c的内存地址。也就是说,考虑变量c被分配了内存地址1000H,然后该地址存储在指针b中,当我们使用*b时,显示b中地址内的值。我们对*b所做的任何更改都会反映在c中,c中所做的更改会反映在*b

  
      
  1. 在下面的块中,* b设置为14,但它仍然给出c的新值,为什么?
  2.   

b指向c中的地址,因此当c中的值发生变化时,*b显示的值也会发生变化

  
      
  1. 最后,&amp; c作为* a通过f2,即使f2是void函数,其值也会改变。为什么会这样呢?
  2.   

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的本地变量,其中包含f2c)变量的地址。与main()相同,但这次它获得了主要内容b的内容。 b与局部变量c相同,但它从a得到a变量的地址。

现在你拥有了所有地址。通过main()访问它,您可以更改它们指向的位置。副本(通过复制*ab 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的地址,而表达式*bc会产生值存储在 c中。

  

n低于* b的块被设置为等于14,但它仍然给出c的新值,为什么?

请注意*bc评估相同的内容,因此编写*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相同。它与函数返回类型无关。