我见过处理 *param1 和 ¶m2 的 C 函数调用
func1(*param1);
func2(¶m2);
我知道 * 和 & 必须使用指针。那么这两种不同的方式有什么目的呢?各有什么优势?
func1(*param1);
在这种情况下,您将指针param1
指向的地址的内容传递给函数func1
。
func2(¶m2);
在这种情况下,您将 的地址传递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
指针定义:在变量定义期间,星号具有不同的含义。它用于定义指针而不是取消引用。诚然,对于新手来说有点混乱......
当您说*param1
要取消引用指针时。所以 ifparam1
是一个指向整数的指针1
,你本质上是在说func1(1)
.
当您说¶m2
您正在将地址传递param2
给函数时。所以基本上你是在传递一个指向param2
.
*
是此上下文中的取消引用运算符,而&
是引用运算符。例如,假设您有两个变量: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++ 中那样的“引用”,只有指针和值。
至于一种方式相对于另一种方式的优势,我真的不会说有一种方式。这仅取决于您需要您的功能做什么。假设您想创建一个名为 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
的指针,该变量会被复制——但这没关系,因为它仍然指向同一个值。因此,当我们使用取消引用运算符更改值时,从某种意义上说,值会“全局”更改 - 因此任何拥有指向相同值的指针的人也会看到更改。
这是基本 C.
*
取消引用指针,转到存储在指针中的内存地址,并根据指针声明的类型评估那里的内存。例如:一个指向 int 的指针,当被取消引用时,将提供一个整数值。&
检索存储变量的内存地址。该地址可以存储在指针变量中。