有人可以让我知道对指针的引用的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;
}
答案 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);
进行了调用,那么k
将func
视为foo
的引用 }}。
func
更改foo
,则实际上正在更改k
。现在问题是C没有引用。但是,说实话,C ++引用是C指针。不同之处在于引用不能为NULL,不应该被视为指向C数组的开头,而引用隐藏指针使您看起来像是直接处理变量的操作。
因此,每次在C ++中看到引用时,都需要将其转换为C中的指针。引用的类型无关紧要; 即使它是指针,引用变成一个指针本身,所以你有一个指针指针。
那么什么是指针呢?请记住,内存只是一个很大的字节数组,每个字节都有一个地址。指针是包含地址的变量。 C和C ++提供指针类型,因此语言可以确定指针指向的数据类型。因此int
是整数值,int*
是指向整数值的指针(与指向字符,结构或其他任何内容的指针相对)。
这意味着您可以使用指针执行两项常规操作:您可以对指针本身进行操作,也可以对指针指向的对象进行操作。如果指针指向结构,则使用一元前缀*
(例如*pr
)或->
时会发生后者。 (a->b
实际上只是(*a).b
的简写。)