1

我对 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是怎么打印出来的呢?

4

3 回答 3

1

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

&testValue是变量valuePassed的地址

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

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

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

打印 100 是testValue的当前值

这就是指针的目标

于 2020-04-14T17:42:52.627 回答
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)

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

于 2020-04-14T17:46:04.713 回答
0

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

这里发生的奇迹是因为两件事:

  1. valuePassedtestValue由调用中的地址分配给changeValue()as valuePassed
changeValue(&testValue);

请注意,这会&产生对象的地址。

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

此运算符取消引用指针valuePassed。意味着它访问的对象valuePassed指向。

以这种方式,100被分配给testValue内部的对象main()并由其后100的调用打印。printf()

于 2020-04-14T17:45:43.787 回答