C语言什么时候用&运算符?

When do you use the & operator in C language?

我从我的笔记中查看了这个示例,它不包括 & 运算符,&i,在循环打印时 i 之前

#include <stdio.h>
 
int main() {
  int i;
 
  for (i = 1; i < 11; ++i)
  {
    printf("%d ", i);
  }
  return 0;
}

什么时候使用 & 运算符比较合适,为什么这里不使用它。你只需要在使用 scanf 时使用它还是它也需要在 printf 中使用?

通常,当您需要对象的值时,您只需使用对象的名称,例如 i。在printf("%d ", i)中,我们希望printf打印出i的值,所以直接传i.

scanf("%d", …)中,我们不想告诉scanfi的值是什么。我们希望 scanf 更改 i。为此,我们必须为 scanf 提供一些对 i 的引用。为此,我们给 scanf i 的地址,其中 scanf("%d", &i).

因此,在将参数传递给例程时,如果要将对象的地址传递给该例程,您将使用 &。如果要传值就不用&.

从技术上讲,每当我们在表达式中写入 i 时,它指定的是对象 i,而不是它的值。但是,在许多情况下,对象会自动转换为其值。所以,在 printf("%d", i*3); 中,对象 i 自动转换为它的值,然后将值乘以 3。这是语言的自动部分,而且效果很好,所以你很少有考虑一下。

这种将对象自动转换为其值的方式称为左值转换。它有一些例外。在这些情况下,我们希望使用对象 i 而不是它的值:

  • 在作业中,例如 i = 3;,我们希望作业更改 i
  • sizeof i 中,我们想要对象的大小 i,而不是它的值或它的值的大小。
  • &i中,我们要的是i的地址,而不是其值的地址。
  • ++ii++--ii--中,我们要修改对象i

在所有这些情况下,都不会自动将对象转换为其值。这是C语言设计的一部分。

还有两个例外:

  • 使用用于访问结构或联合成员的运算符 .,左操作数不会转换为其值。因此,如果 s 是一个结构,那么在 s.i 中,s 仍然是结构的名称,表达式 s.i 则指定成员 i那个结构的。 (要继续计算 this 出现的表达式,然后将该成员转换为其值,除非它也出现在这些异常之一中。)
  • 如果对象是数组,则不会将其转换为其值。 (根据数组的单独规则,它通常被转换为指向其第一个元素的指针。)