C使用* param和¶m调用函数

时间:2013-05-31 18:41:48

标签: c pointers

我见过处理* param1和& param2

的C函数调用
   func1(*param1);

   func2(&param2);

我知道*和&必须指点。那么这两种不同方式的目的是什么呢?每个人的任何优势?

4 个答案:

答案 0 :(得分:7)

func1(*param1);

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

func2(&param2);

在这种情况下,您将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)

当您说&param2时,您将param2的地址传递给该函数。所以基本上你传递的指针是param2

答案 2 :(得分: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中,没有像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的指针,当取消引用时,将提供整数值。
  • & 检索存储变量的内存地址。该地址可以存储在指针变量中。