我无法理解&
运算符的工作原理及其重要性。
我在网上找到了这个例子:
#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
会打印出这两个额外数字?
其次,为什么这很重要?
答案 0 :(得分:0)
&
运算符是“地址”运算符。因此&a
表示address of a
,而不仅仅是a。
这告诉你的是a的地址是1002
(或者作为dreamlax指出,很可能不是真正的地址,因为有关如何使用printf的奇怪之处),即使值为{ {1}}。请注意,这两个值之间没有严格的关联,您可以轻松拥有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
所做的更改。
如果要对给定对象进行更改并将这些更改反映在原始副本中,则此选项本身很有用。但是,即使您不想修改原始副本中的值,这也是有用的性能,因为您可以避免复制任何值。对于一个简单的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)
运算符的地址&
返回以下变量的内存地址。这很重要,因为:
它允许使用轻量级句柄引用大内存块(结构,数组,动态分配的非结构化内存区域)
它提供了访问数据结构内部表示的方法
它允许我们通过相同的界面处理不同类型的数据