为什么地址运算符(&)对于通过函数传递的数组很重要?

时间:2013-04-17 22:31:13

标签: c arrays pointers operators

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

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

 #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 个答案:

答案 0 :(得分:0)

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

的值

这告诉你的是a的地址是1002(或者作为dreamlax指出,很可能不是真正的地址,因为有关如何使用printf的奇怪之处),即使值为{ {1}}。请注意,这两个值之间没有严格的关联,您可以轻松拥有10a=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所做的更改。

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

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

a

这一次,对struct LargeStruct { int buffer[134217728]; }; void doIt(LargeStruct buffer) { // ... do something } void doItByReference(LargeStruct *buffer) { // ... do something } 的每次调用都必须复制整个doIt对象,该对象是数百万字节,其中 - 因为对doItByReference的调用只是使用现有对象而不需要复制。

答案 1 :(得分:0)

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

至于为什么这很重要:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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

  3. 它允许我们通过相同的界面处理不同类型的数据