我无法理解&运算符的工作方式及其重要性。

我在网上找到了这个例子:

 #include <stdio.h>

void main()
{
  int a = 10;
  printf("\nValue of n is : %d" ,n);
  printf("\nValue of &n is : %u", &n);
}

输出:

Value of  n is : 10
Value of &n is : 1002

首先,为什么&n打印出这两个额外的数字?

其次,为什么这很重要?

===============>>#1 票数:0

&运算符是运算符的“地址”。 因此&a表示&aaddress of a ,而不仅仅是a的值。

这告诉您的是,即使该值为10 ,a的地址也为1002 (或如dreamlax所指出的,由于使用printf的方式存在奇数,因此很有可能不是真实地址)。 请注意,两个值之间没有严格的相关性,您可以轻松地获得a=121765&a=494260

知道变量的地址后,您就可以操纵该变量“引用”或“指向”的特定值/对象。 如果希望函数操作该特定值/对象而不是操作副本,则应传递变量的地址。

使用以下代码(不一定是完整的代码):

int main(void)
{
    int a = 10;
    doIt(a);
    printf("after doIt: %d", a);
    doItByReference(&a);
    printf("after doItByReference: %d", a);
}

void doIt(int val)
{
    val = 13;
}

void doItByReference(int *val)
{
    *val = 15;
}

调用doIt会传递a持有的值,而位于不同地址的新整数变量会将该值复制到其中。 该功能是免费的,使这个副本的任何改变,没有修改将在原可以看出a变量。

但是,调用doItByReference传递的地址a 在给定地址的值所做的任何更改将反映为所做的更改a

如果您想对给定的对象进行更改并使这些更改反映在原始副本中,那么这本身就很有用。 但是,即使您不想修改原始副本中的值,这也是有用的性能选择,因为您不必复制任何值。 对于一个简单的int,可以说是4个字节(确切的值并不重要),这无关紧要。

但是,假设您有一个成千上万个字节的结构:

struct LargeStruct
{
    int buffer[134217728];
};

void doIt(LargeStruct buffer)
{
    // ... do something
}

void doItByReference(LargeStruct *buffer)
{
    // ... do something
}

这一次,每次对doIt调用都必须复制整个LargeStruct对象,该对象为数百万个字节,而对doItByReference的调用仅使用现有对象,而无需复制。

===============>>#2 票数:0

n是一个变量。 它代表一个值。
&n是对n的引用。 它表示存储n的内存中的地址。

关于它为什么重要的原因:

当您使用C传递数组时,该函数通常需要一个指针。 (即:int *,而不是int)。
如果将“ n”传递给函数,则在编译时会抱怨,因为类型不匹配(n = int,函数期望int *)。
如果您传入&n,那么您会将一个地址传递给'n',这正是函数所期望的。

===============>>#3 票数:0

要在C中打印地址,通常应使用%p代替%u

注意%p以十六进制数输出地址。

===============>>#4 票数:0

运算符&的地址返回以下变量的内存地址。 这很重要,因为:

  1. 它允许使用轻量级句柄引用大型内存块(结构,数组,动态分配的非结构化内存区域)

  2. 它提供了访问数据结构内部表示的方法

  3. 它允许我们通过同一接口处理不同类型的数据

  ask by user2247143 translate from so

未解决问题?本站智能推荐: