【问题标题】:Pointer/pointer variable assigning and printing output指针/指针变量赋值和打印输出
【发布时间】:2020-07-27 12:58:21
【问题描述】:

我对 C 中的指针很陌生,我有一个练习题,但我不明白为什么答案是这样。代码如下:

#include <stdio.h>
#include <stdlib.h> 

void changeValue(int *valuePassed)
{
    *valuePassed = 100;
}

int main()
{
    int testValue = 9;
    changeValue(&testValue);
    printf("%d\n", testValue);
}

这最终会打印 100,我不知道为什么。

首先,函数 changeValue 是传递一个指针变量还是传递地址 valuePassed 的值(据我所知,这是两个不同的东西)。其次,*valuePassed = 100 行将 valuePassed 位置的值设置为 100,对吗?但是 valuePassed 没有被分配地址。那么如果将testValue(&testValue)的地址传入changeValue函数中,100是怎么打印出来的呢?

【问题讨论】:

  • *valuePassed = 100; 保证它将打印100 你期望什么?传递 address of` 运算符允许函数修改位于该地址的 _value

标签: c pointers pass-by-reference function-definition


【解决方案1】:

首先,函数 changeValue 是被传递一个指针变量还是 是否在地址 valuePassed 处传递了值(据我所知, 这是两个不同的东西)

这里传递了变量testValue的地址

changeValue(&testValue);

分配给指针变量valuePassed,它是函数的参数,同时也是函数的局部变量..

void changeValue(int *valuePassed)

你可以想象如下的函数调用和函数定义

changeValue(&testValue);

//...

void changeValue( /* int *valuePassed */ )
{
    int * valuePassed = &testValue;
    *valuePassed = 100;
}

但是 valuePassed 没有被分配地址。

你错了。正如您在上面看到的,它是由变量testValue 的地址分配的。

所以如果将testValue(&testValue)的地址传入 changeValue函数,100是怎么打印出来的?

没有指向整数常量100。变量testValue被指向,而它指向的内存是定义变量的地方,整数常量100被存储。

在 C 语言中,通过指向对象的指针间接传递对象称为通过引用传递。

来自 C 标准(6.2.5 类型,p.#20)

——指针类型可以派生自函数类型或对象 类型,称为引用类型。 指针类型描述了一个对象 其值提供对被引用实体的引用 type. 从引用的类型 T 派生的指针类型有时是 称为“指向 T 的指针”。从一个指针类型的构造 引用类型称为“指针类型派生”。指针类型 是一个完整的对象类型。

【讨论】:

  • 好的,这是有道理的,但是你是如何获得函数调用/定义的呢?这就是让我失望的原因,当 &testValue 被传递给函数时,我不知道 int *valuePassed = &testValue ,我认为它是一个替代另一个。感谢您的回复!
  • @cmting17 没有这样的函数定义。但在底层,函数的参数是由用作参数的传递表达式的值初始化的。
【解决方案2】:

是函数changeValue被传递一个指针变量还是它被传递地址valuePassed处的值

&testValue是变量valuePassed

的地址

*valuePassed = 100 是把 valuePassed 位置的值设置为 100,对吗?

"valuePassed = 100;" 改变了变量valuePassed的值,但是这里因为"*"的形式"*valuePassed = 100;" 修改valuePassed中存储地址的值。因为 valuePassedvaluePassed 的地址赋值,所以赋值将 valuePassed 的值修改为 100

 printf("%d\n", testValue);

打印 100 是 testValue

的当前值

这就是指针的目标

【讨论】:

    【解决方案3】:

    那么如果将testValue(&testValue)的地址传入changeValue函数,100是怎么打印出来的呢?

    这里的神奇之处在于两件事:

    1. valuePassed 在对changeValue() 的调用中由testValue 的地址分配为valuePassed
    changeValue(&testValue);
    

    注意,&amp; 产生一个对象的地址。

    1. * 取消引用运算符:
        *valuePassed = 100;
    

    此运算符取消引用指针valuePassed。表示它访问valuePassed 指向的对象。

    通过这种方式,100 被分配给 main() 内部的对象 testValue,然后通过调用 printf() 来打印 100

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      相关资源
      最近更新 更多