0

我无法理解&操作员的工作方式及其重要性。

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

 #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打印出这两个额外的数字?

其次,为什么这很重要?

4

4 回答 4

0

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

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

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

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

于 2013-04-17T23:14:12.817 回答
0

要在 C 中打印出地址,通常应该%p使用%u.

注意%p以十六进制数字打印出地址。

于 2013-04-17T22:51:39.697 回答
0

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

这告诉你的是 a 的地址是1002(或者正如 dreamlax 所指出的,由于 printf 的使用方式很奇怪,很可能不是真正的地址),即使值是10. 请注意,这两个值之间没有严格的相关性,您可以很容易地拥有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

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

但是,假设您有一个数千或数百万字节的结构:

struct LargeStruct
{
    int buffer[134217728];
};

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

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

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

于 2013-04-17T22:35:10.277 回答
0

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

至于为什么重要:

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

于 2013-04-17T22:36:30.090 回答