什么是C指数对指针"*&"的引用

Gar*_*ngh 0 c pointers reference

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

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

void func(int* p, int*& pr)
{
    p++;
    pr++;
}
Run Code Online (Sandbox Code Playgroud)

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

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

int i = 10;
int *p1 = &i;
int **pr= &p1;
Run Code Online (Sandbox Code Playgroud)

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

(p1)++
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mik*_*one 6

您使用指针指针.

void func(int* p, int** pr)
{
    p++;
    (*pr)++;
}
Run Code Online (Sandbox Code Playgroud)

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


对不起,迟到了...

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

int i = 10;
int *p1 = &i;
int **pr= &p1;
Run Code Online (Sandbox Code Playgroud)

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

(p1)++
Run Code Online (Sandbox Code Playgroud)

是.

但是,我无法理解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;
}
Run Code Online (Sandbox Code Playgroud)

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

在实践中审查参考文献:

  • 如果你的函数声明void func(int foo);,并呼吁与int k = 0; foo(k);复制k被提出,func认为的foo.
    • 如果func改变foo,k不会改变.您经常会看到函数"垃圾"这样的传递复制参数.
  • 如果你的函数被声明void func(int& foo);并调用,int k = 0; foo(k);则会引用一个kfunc视为的引用foo.
    • 如果func改变foo,它实际上正在改变k.
    • 这通常用于"传回"更多的值而不仅仅是返回值,或者当函数需要以某种方式持久地修改对象时.

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

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

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

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