首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >指针作为C++中的函数参数

指针作为C++中的函数参数
EN

Stack Overflow用户
提问于 2013-09-09 20:32:33
回答 4查看 65K关注 0票数 34

如果我有这样的代码,例如:

代码语言:javascript
复制
int num = 5;
int *ptr = #

下面两个函数的区别是什么?

代码语言:javascript
复制
void func(int **foo);
void func(int *foo); 

在我调用函数的地方:

代码语言:javascript
复制
func(&ptr); 

我意识到前一种方法将指向指针的指针作为参数,而第二种方法只使用指针。

如果我传入func(&ptr),我实际上就是在传入一个指针。指针指向另一个指针有什么区别?

我相信后者会给出不兼容的警告,但看起来细节并不重要,只要你知道你在做什么。似乎为了可读性和理解前者是一个更好的选择(2星指针),但从逻辑的角度来看,区别是什么?

EN

回答 4

Stack Overflow用户

发布于 2013-09-09 20:37:24

不同之处很简单,就是处理器将处理代码的操作。在这两种情况下,值本身都只是一个地址,这是真的。但是,当地址被解除引用时,对于处理器和编译器来说,知道在解除引用之后它将处理什么是很重要的。

票数 8
EN

Stack Overflow用户

发布于 2013-09-09 20:44:13

通常,这种差异表明函数将赋值给指针,并且这种赋值不应该仅仅是函数的局部赋值。例如(请记住,这些示例的目的是为了检查foo的性质,而不是完整的函数,而不是你原始帖子中的代码应该是真正的工作代码):

代码语言:javascript
复制
void func1 (int *foo) {
    foo = malloc (sizeof (int));
}

int a = 5;
func1 (&a);

类似于

代码语言:javascript
复制
void func2 (int foo) {
    foo = 12;
}

int b = 5;
func2 (b);

在这个意义上,foo在func2()中可能等于12,但是当func2()返回时,b仍然等于5。在func1()中,foo指向一个新的整数,但是当a ()返回时,func1仍然是a

如果我们想要更改ab的值,该怎么办?WRT b,一个正常的整数:

代码语言:javascript
复制
void func3 (int *foo) {
    *foo = 12;
}    

int b = 5;
func2 (&b);

将会工作--请注意,我们需要一个指向int的指针。若要更改指针中的值(即。它所指向的int的地址,而不仅仅是它所指向的int中的值):

代码语言:javascript
复制
void func4 (int **foo) {
    *foo = malloc (sizeof (int));
}

int *a;
foo (&a);

'a‘现在指向由func4()中的malloc返回的内存。地址&aa的地址,它是一个指向int的指针。int指针包含int的地址。func4()接受一个整型指针的地址,以便它可以将一个整型指针的地址放入该地址,就像func3()获得一个整型指针的地址,以便可以将一个新的int值放入其中一样。

这就是如何使用不同的参数样式。

票数 1
EN

Stack Overflow用户

发布于 2018-03-25 19:00:27

问这个问题已经有一段时间了,但这是我对这个问题的看法。我现在正在尝试学习C语言,而指针是无休止的令人困惑的…因此,我利用这段时间来澄清指针上的指针,至少对我来说是这样。以下是我对此的看法。

我举了here的一个例子

代码语言:javascript
复制
#include <stdlib.h>
#include <string.h>

int allocstr(int len, char **retptr)
{
    char *p = malloc(len + 1);  /* +1 for \0 */
    if(p == NULL)
        return 0;
    *retptr = p;
    return 1;
}

int main()  
{
    char *string = "Hello, world!";
    char *copystr;
    if(allocstr(strlen(string), &copystr))
        strcpy(copystr, string);
    else    fprintf(stderr, "out of memory\n");
    return 0;
}

我想知道为什么allocstr需要双指针。如果它是一个指针,它意味着你可以传递它,它将在返回后被改变……

如果你做这个例子,它工作得很好。但是,如果您将分配字符串更改为只有*指针而不是**指针(并且在main中使用copystr而不是©str ),则会得到segmentation fault。为什么?我在代码中放了一些printfs,它工作得很好,直到使用strcpy行。所以我猜它没有为copystr分配内存。再问一次,为什么?

让我们回到指针传递的含义。这意味着你可以传递内存位置,你可以直接在那里写你想要的值。您可以修改该值,因为您可以访问该值的内存位置。

类似地,当您将指针传递给指针时,您将传递指针的内存位置,换句话说,就是内存位置的内存位置。现在(指向指针的指针)您可以更改内存位置,因为您可以在仅使用指针时更改该值。

代码工作的原因是您传递了内存位置的地址。函数allocstr会更改该内存位置的大小,以便它可以保存"Hello world!“并返回指向该内存位置的指针。

它实际上和传递一个指针是一样的,但是我们有一个内存位置,而不是一个值。

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

https://stackoverflow.com/questions/18698317

复制
相关文章

相似问题

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