什么是C-等价于指针" *&"

时间:2015-04-06 10:58:44

标签: c pointers reference

有人可以让我知道对指针的引用的C等价物" *&"?

换句话说,如果我的函数在C ++中是这样的:

void func(int* p, int*& pr)
{
    p++;
    pr++;
}

如何在C中转换它时更改第二个参数?

更新 @MikeDeSimone:如果我理解了翻译的代码,请告诉我? 让我先从初始化变量开始:

int i = 10;
int *p1 = &i;
int **pr= &p1;

所以,当你执行(* pr)++时,基本上相当于:

(p1)++

然而, 我无法理解main()内部的外观如何?

问题2:如果我有这样的代码段,我该怎么办?

void pass_by_reference(int*& p)
{
        //Allocate new memory in p: this change would reflect in main
    p = new int;
}

1 个答案:

答案 0 :(得分:6)

使用指向指针的指针。

void func(int* p, int** pr)
{
    p++;
    (*pr)++;
}

例如,参见strtoul的第二个参数,该函数用于返回解析停止的点。


对于迟到的更新感到抱歉......

  

如果我理解了翻译的代码,请告诉我?让我先从初始化变量开始:

int i = 10;
int *p1 = &i;
int **pr= &p1;
  

所以,当你执行(* pr)++时,基本上相当于:

(p1)++

  

但是,我无法理解main()内部的外观如何?

我不明白main是如何形成的;我们在谈论func。对于此讨论,main将是一个与其他任何函数一样的函数。函数内声明的变量仅在执行该函数时存在。

  

问题2:如果我有这样的代码片段,我该怎么办?

void pass_by_reference(int*& p)
{
        //Allocate new memory in p: this change would reflect in main
    p = new int;
}

要记住关于传递给函数的引用的事情是它们只是说"这个参数是对传递给函数的参数的引用,并且更改它会改变原始函数。 是非参考参数的本地副本。"

在实践中检讨参考文献:

  • 如果您的功能已声明为void func(int foo);并且使用int k = 0; foo(k);进行了调用,那么会k func的{​​em>副本 foo }}。
    • 如果func更改foo,则k不会更改。你会经常看到函数" trash"他们这样的传递复制参数。
  • 如果您的功能已声明为void func(int& foo);并且使用int k = 0; foo(k);进行了调用,那么kfunc视为foo引用 }}。
    • 如果func更改foo,则实际上正在更改k
    • 这通常是为了回传"更多的值不仅仅是返回值,或者当函数需要以某种方式持久地修改对象时。

现在问题是C没有引用。但是,说实话,C ++引用是C指针。不同之处在于引用不能为NULL,不应该被视为指向C数组的开头,而引用隐藏指针使您看起来像是直接处理变量的操作。

因此,每次在C ++中看到引用时,都需要将其转换为C中的指针。引用的类型无关紧要; 即使它是指针,引用变成一个指针本身,所以你有一个指针指针。

那么什么是指针呢?请记住,内存只是一个很大的字节数组,每个字节都有一个地址。指针是包含地址的变量。 C和C ++提供指针类型,因此语言可以确定指针指向的数据类型。因此int是整数值,int*是指向整数值的指针(与指向字符,结构或其他任何内容的指针相对)。

这意味着您可以使用指针执行两项常规操作:您可以对指针本身进行操作,也可以对指针指向的对象进行操作。如果指针指向结构,则使用一元前缀*(例如*pr)或->时会发生后者。 (a->b实际上只是(*a).b的简写。)