Pav*_*van 11 c++ pointers reference
我正在研究指针参考,并遇到了不同的方式来提供参数.有人可以解释每个人的实际含义吗?
我认为第一个很简单,x就是输入参数的副本,因此在堆栈上创建了另一个变量.至于其他人,我很无能为力.
void doSomething1(int x){
//code
}
void doSomething2(int *x){
//code
}
void doSomething3(int &x){
//code
}
void doSomething3(int const &x){
//code
}
Run Code Online (Sandbox Code Playgroud)
当声明变量时,我也会看到这样的东西.我不明白他们之间的差异.我知道第一个将放入堆栈中100的变量y.它不会创建新地址或任何东西.
//example 1
int y = 100;
//example 2
int *y = 100;
//Example 3: epic confusion!
int *y = &z;
Run Code Online (Sandbox Code Playgroud)
问题1:我如何使用这些方法?什么时候最合适?
问题2:何时以这种方式声明变量?
例子很棒.
PS这是我没学习C++的主要原因之一,因为Java只有垃圾收集.但现在我必须进入C++.
sbi*_*sbi 10
Run Code Online (Sandbox Code Playgroud)//example 1 int y = 100; //example 2 int *y = 100; //Example 3: epic confusion! int *y = &z;
我想对于大多数学生的问题是,在C++都&和*具有不同的含义,这取决于它们所使用的上下文.
如果它们中的出现类型之后的对象声明中(T*或T&),它们是类型修饰符和改变从滑动的类型T到一个参照本发明的T(T&)或一个指向一个T(T*).
如果它们出现在对象(&obj或*obj)的前面,则它们是在对象上调用的一元前缀运算符.前缀&返回为其调用的对象的地址,* 取消引用指针,迭代器等,产生它引用的值.
它不会有助于防止类型修饰符应用于声明的对象而不是类型的混淆.也就是说,T* a, b;定义一个T*named a和一个T名为plain的b原因,这就是为什么很多人喜欢编写的T *a, b;(注意在*定义的对象旁边的类型修改的位置,而不是修改的类型).
同样无益的是术语"引用"过载.一方面,它意味着一个句法结构,如T&.但是,"参考"的更广泛含义是指其他东西.在这个意义上,指针T*和引用(其他含义T&)都是引用,因为它们引用了一些对象.当有人说"指针引用某个对象"或指针被"取消引用"时,它就会发挥作用.
所以在你的特定情况下,#1定义了一个普通的int,#2定义了一个指向a的指针,int并用地址初始化它100(不管生活中哪些生命最好不要触及),#3定义另一个指针并用一个地址初始化它.对象z(必然int也是).
关于如何将对象传递给C++中的函数,这是我的一个老答案.
阅读 S.Lippmann 的 C++ Premier 或任何其他优秀的 C++ 书籍。至于传递参数,通常当复制成本较低时,我们按值传递。对于强制输出参数,我们使用引用,对于可选输出参数 - 指针,对于复制成本较高的输入参数,我们通过 const 引用传递