我见过处理* param1和& param2
的C函数调用 func1(*param1);
func2(¶m2);
我知道*和&必须指点。那么这两种不同方式的目的是什么呢?每个人的任何优势?
答案 0 :(得分:7)
func1(*param1);
在这种情况下,您将指针param1
指向的地址的内容传递给函数func1
。
func2(¶m2);
在这种情况下,您将param2
的地址传递给函数func2
。
本质上,第二个创建一个新指针(即“查看那里!”),第一个指示指针指向的是什么(即“这个盒子里有什么?”)。
为了推动这一点,这是一个几乎没用的例子:
int x = 1234; /* an example value */
int *y = &x; /* The pointer y now points at x (or the memory location in which x resides). */
int z = *y; /* z is now = 1234 - it looked at what y was pointing at and took that value. */
int w = *(&x); /* w is now = 1234 - I created a temporary pointer and then immediately dereferenced it. */
另外,请注意int *y
指针定义:在变量定义期间,星形具有不同的含义。它用于定义指针而不是取消引用指针。对于新手而言有点令人困惑....
答案 1 :(得分:4)
当您说*param1
时,您正在取消引用指针。因此,如果param1
是指向整数1
的指针,那么您实际上是在说func1(1)
。
当您说¶m2
时,您将param2
的地址传递给该函数。所以基本上你传递的指针是param2
。
答案 2 :(得分:4)
*
是此上下文中的解除引用运算符 ,而&
是引用运算符。例如,假设您有两个变量:int *a
和int b
。 a
是指向某个整数值的指针,而b本身是一个整数值。然后,例如:
func(a) // Pass a copy of a, which points to the same value as a.
func(*a) // Pass a copy of the value a points to.
func(b) // Pass a copy of b.
func(&b) // Pass a pointer which points to b.
另外一个注意事项是C&运算符不要与混淆,在C ++中,当函数定义为:void func(const std::string &s)
时 - 在C中,没有像C ++中那样的“引用”,只有指针和值
至于另一种方式的优势,我不会说有一种方式。这取决于你的功能需要做什么。假设您想要创建一个名为modifyNumber()的函数,该函数接受一些整数并更改它 - 并且您希望调用者可以看到该更改。
每当将值传递给C中的函数时,它们都被复制 - 这意味着,如果你定义了你的modifyNumber()函数:
modifyNumber(int i)
{
i = 5;
}
它会更改i
的值,但只会 i
的副本。如果您希望调用该函数的代码也能看到更改,则需要执行以下操作:
modifyNumber(int *i)
{
*i = 5;
}
// Elsewhere in the code...
int i = 1;
modifyNumber(&i);
// Now i == 5.
在这种情况下,您将指针传递给您的变量i
,该指针会被复制 - 但这没关系,因为它仍然指向相同的值。因此,当我们使用取消引用运算符更改值时,该值在某种意义上会“全局”更改 - 因此任何具有指向相同值的指针的人都会看到更改。
答案 3 :(得分:3)
这是基本的C。
*
取消引用指针,转到存储在指针中的内存地址,并根据指针的声明类型评估内存。例如:指向int的指针,当取消引用时,将提供整数值。&
检索存储变量的内存地址。该地址可以存储在指针变量中。