C++ 在C++;参数中的引用和指针实际上是如何工作的?他们的固定协议是什么;规则;?
说你有C++ 在C++;参数中的引用和指针实际上是如何工作的?他们的固定协议是什么;规则;?,c++,pointers,parameters,parameter-passing,pass-by-reference,C++,Pointers,Parameters,Parameter Passing,Pass By Reference,说你有 void foo(inta,int&b,int*c){…} int main(){ int d=0, e=1, f=2; foo(d, e, &f); } 我的理解是,函数声明参数必须与参数具有相同的类型。因此a、b和c前面的“int”是因为d、e和f都是int 但这是否扩展(也适用)到引用和指针,即&和*? 我的意思是,如果你有int&b,那么e必须已经是地址了吗 我原以为是的,但现在我觉得读了这篇文章后,我的概念错了: 其中,中概述的代码与我上面所写的基本相同
void foo(inta,int&b,int*c){…}
int main(){
int d=0, e=1, f=2;
foo(d, e, &f);
}
我的理解是,函数声明参数必须与参数具有相同的类型。因此a、b和c前面的“int”是因为d、e和f都是int
但这是否扩展(也适用)到引用和指针,即&
和*
?
我的意思是,如果你有int&b
,那么e
必须已经是地址了吗
我原以为是的,但现在我觉得读了这篇文章后,我的概念错了:
其中,中概述的代码与我上面所写的基本相同
在阅读了上面的线程和代码之后,似乎参数中的&
和*
实际上不是“类型限制”的一部分——也就是说,它并不意味着e必须是地址,或者f必须是指针
参见前面的我认为参数中的参数名a、b、c
严格指定了它必须是什么类型
因此,您可以编写如下代码:
void foo(int a, int &b, int *c){...}
int main(){
int d=0, e=1, f=2;
foo(d, &e, *f); // wrong
}
相反,参数中的&
似乎实际接受传入的variabe/object参数,并更改或获取其地址。而*
实际上是作用于f(&f
)的地址,该地址作为参数传递并检索其内容。是这样吗
这是否只是放置在必须接受的参数中的&
和*
的给定协议/规则
我读过很多关于参数中的引用和指针的文章,它们都非常清楚地解释了参数中的&
和*
允许更改传递的变量的值。但是,当将它们放入参数中时,它们不会深入到&
和*
的实际过程/协议中
让我知道我是否在概念上正确。
谢谢大家! >怀疑出现,因为在C++中,在不同的上下文中,相同的操作符用于不同的目的。例如,以下运算符在不同情况下具有不同的含义 运算符
&
可以表示变量的地址或变量的引用。例如,考虑下面的代码,
int *ptr;
int n=111;
ptr=&n;
int *ptr;
在上述代码中,运算符&
获取变量n
的地址
现在考虑下面所示的代码,
int a=111;
int &ref = a;
int a=111,b;
int *ptr = &a;
b=*ptr;
此处和用于创建变量a
的引用。您可以使用变量ref访问变量a
运算符*
可用于创建指针变量或获取变量的内容。例如,考虑下面的代码,
int *ptr;
int n=111;
ptr=&n;
int *ptr;
在上述代码中,运算符*
用于将ptr
声明为指针变量
现在考虑下面所示的代码,
int a=111;
int &ref = a;
int a=111,b;
int *ptr = &a;
b=*ptr;
这里使用*ptr
获取a
的内容
< C++ >在不同的上下文中也有不同的含义,例如
运算符+
可以是一元运算符或二元运算符。例如,+
是
表达式c=a+b中的二元运算符代码>和表达式b=+a中的一元运算符代码>
运算符-
可以是一元运算符或二元运算符。例如-
是
表达式c=a-b中的二元运算符代码>和中的一元运算符
表达式b=-a代码>指针是一个变量,它包含指向某个对象的地址。参考资料实际上是一个指针,它有一个漂亮的包装,图片中有大量的糖使它看起来美味可口。在里面,一旦你打开它,它也会做同样的事情
当他们将漂亮的包装放在指针周围以进行引用时,他们确实使引用变得更安全了,因为引用不能是NULL
,所以在使用引用时,您不必检查是否有人使用“NULL”作为输入-指针可以是NULL
,因此您必须首先检查这一点[或者不要,但它可能会崩溃-这不是很好…]
良好的封装意味着编译器知道为引用传递地址,如果您有指针,则必须确保它是传入的地址—或者使用指针变量作为参数,或者使用运算符的地址
我敢肯定,他们使用&
作为“这是一个引用”的原因与“在此处传递地址,但将变量传递给函数时无需执行任何操作,编译器将为您进行修复”这一事实有关
声明指针时,使用*
——这适用于函数的变量和参数
在其他地方,&
表示“某物的地址”(将其变成指针),而*
表示“该指针指向的内容”。同样,好的包装意味着使用引用时,*
是隐藏的,但编译器会为您做这些事情。我强烈认为您需要打开一些书,至少看一次。符号(&)和星号(*)做同样的事情,但只是他们看起来不同,他们做的事情也不同
首先,
指针,如您所知,是存储地址的数据类型,即其目的是指向另一个变量
参考资料-关于它们的两件事。
1) .引用只是它们所引用的对象/变量的另一个名称。
2) .References已被引入以克服指针不整洁和复杂的语法。请参阅两者的声明和用法
int num = 45;
int* ptr = #
int& ref = num;
ptr和ref都指向num。请注意它们的语法以及它们的终止方式