首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用*param和&param调用C函数

使用*param和&param调用C函数
EN

Stack Overflow用户
提问于 2013-06-01 02:41:48
回答 4查看 282关注 0票数 2

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

代码语言:javascript
复制
   func1(*param1);

   func2(&param2);

我知道指针的* and & to。那么purpose用这两种不同的方式做什么呢?每一个都有什么优势吗?

EN

回答 4

Stack Overflow用户

发布于 2013-06-01 02:44:34

代码语言:javascript
复制
func1(*param1);

在本例中,您将把指针param1所指向的地址的内容传递给函数func1

代码语言:javascript
复制
func2(&param2);

在本例中,您将把param2的地址传递给函数func2

本质上,第二个创建了一个新的指针(即,“看看那里!”)第一个告诉你指针指向的是什么(即“这个框里有什么?”)。

为了让大家明白这一点,这里有一个几乎无用的例子:

代码语言:javascript
复制
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指针定义:在变量定义期间,星号有不同的含义。它用于定义一个指针,而不是取消引用一个指针。诚然,对于一个新手来说,这有点令人困惑……

票数 7
EN

Stack Overflow用户

发布于 2013-06-01 02:44:48

当你说*param1时,你是在取消对指针的引用。因此,如果param1是一个指向整数1的指针,那么您实际上就是在说func1(1)

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

票数 4
EN

Stack Overflow用户

发布于 2013-06-01 02:47:34

在此上下文中,*是解引用运算符,而&是引用运算符。例如,假设您有两个变量:int *aint ba是一个指向某个整数值的指针,而b本身就是一个整数值。然后,例如:

代码语言:javascript
复制
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()函数:

代码语言:javascript
复制
modifyNumber(int i)
{
    i = 5;
}

它将更改i的值,但仅对其 i.的副本进行如果您希望调用该函数的代码也能看到更改,则需要执行以下操作:

代码语言:javascript
复制
modifyNumber(int *i)
{
    *i = 5;
}

// Elsewhere in the code...

int i = 1;
modifyNumber(&i);
// Now i == 5.

在本例中,您将传递一个指向变量i,的指针,该指针将被复制-但这并没有关系,因为它仍然指向相同的值。因此,当我们使用取消引用操作符更改值时,该值在某种意义上是“全局”更改的-因此,任何指向相同值的人也会看到更改。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16863771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档