2

我见过处理 *param1 和 ¶m2 的 C 函数调用

   func1(*param1);

   func2(&param2);

我知道 * 和 & 必须使用指针。那么这两种不同的方式有什么目的呢?各有什么优势?

4

4 回答 4

7
func1(*param1);

在这种情况下,您将指针param1指向的地址的内容传递给函数func1

func2(&param2);

在这种情况下,您将 的地址传递param2给 function 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指针定义:在变量定义期间,星号具有不同的含义。它用于定义指针而不是取消引用。诚然,对于新手来说有点混乱......

于 2013-05-31T18:44:34.303 回答
4

当您说*param1要取消引用指针时。所以 ifparam1是一个指向整数的指针1,你本质上是在说func1(1).

当您说&param2您正在将地址传递param2给函数时。所以基本上你是在传递一个指向param2.

于 2013-05-31T18:44:47.950 回答
4

*是此上下文中的取消引用运算符,而&是引用运算符。例如,假设您有两个变量:int *aint ba是一个指向某个整数值的指针,而 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++ 中那样的“引用”,只有指针和值。

至于一种方式相对于另一种方式的优势,我真的不会说有一种方式。这仅取决于您需要您的功能做什么。假设您想创建一个名为 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的指针,该变量会被复制——但这没关系,因为它仍然指向同一个值。因此,当我们使用取消引用运算符更改时,从某种意义上说,值会“全局”更改 - 因此任何拥有指向相同值的指针的人也会看到更改。

于 2013-05-31T18:47:34.413 回答
3

这是基本 C.

  • * 取消引用指针,转到存储在指针中的内存地址,并根据指针声明的类型评估那里的内存。例如:一个指向 int 的指针,当被取消引用时,将提供一个整数值。
  • & 检索存储变量的内存地址。该地址可以存储在指针变量中。
于 2013-05-31T18:47:58.747 回答