标签:end 调用 编码 main 寻址 数组 赋值 多级 ons
参数的传递本质上是一次赋值的过程,赋值 <---> 对内存进行拷贝 <---> 将一块内存上的数据复制到另一块内存上
C++禁止在函数调用时直接传递数组的内容,而是强制传递数组指针,而对于结构体和对象没有这种限制。
引用可以看作是数据的一个别名,同个这个别名和原来的名字都能找到这份数据。
引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其他数据,这有点类似于const变量(常量)。
#include <iostream>
using namespace std;
int main() {
int a = 99;
int &r = a;
cout << a << ", " << r << endl;
cout << &a << ", " << &r << endl;
return 0;
}
/*运行结果:*/
99, 99
0x6ffe04, 0x6ffe04
由于引用和原始变量都指向同一地址,所以通过引用也可以修改原始变量中所存储的数据。如何限制通过引用修改原始的数据?
可以在定义时添加const限制,
const int &r = a;
或者int const &r = a;
在定义或声明函数时,可以将函数的形参指定为引用的形式,这样可以在函数内部影响函数外部数据。
#include <iostream>
using namespace std;
int &plus10(int &r) {
r += 10;
return r;
}
int main() {
int num1 = 10;
int num2 = plus10(num1);
cout << num1 << " " << num2 << endl;
return 0;
}
/*运行结果:*/
20 20
注意:引用作为函数返回值时,不能返回局部数据(例如局部变量、局部对象、局部数组等)的引用,因为当函数调用完成后局部数据就会被销毁。
通过&r获取的不是r的地址,而是a的地址,r和a指代的是同一份内存。是不是r这个变量不占用独立的内存?
变量r是占用内存的,而是编译器不让获取它的地址。r存储的是变量a的地址,这说明引用和指针非常相似。
引用只是对指针进行了简单的封装,它的底层依然是通过指针实现的。
1.引用必须在定义时初始化,并且以后也要从一而终,不能再指向其他数据;而指针在定义时不必赋值,也可以指向任意数据。
2.可以有const指针,但是没有const引用。因为引用本来就不能改变指向,加上const多此一举。
3.指针可以有多级,但是引用只能有一级。例如:
int **p
是合法的,而int &&r
是不合法的。
4.指针使用++表示指向下一份数据,引用使用++表示它所指代的数据本身加1。
指针只能指向内存,不能指向寄存器或者硬盘,因为寄存器和硬盘不能寻址。
放在内存中的内容都可以使用
&
来获取地址,进而用指针指向它们。
但是像表达式的结果、函数的返回值等临时数据,它们可能放在内存中,也可能放在寄存器中。一旦被放在寄存器中,就没法用&
获取地址了。
常量表达式虽然在内存中,但是没法寻址。为什么?
因为常量表达式在编译阶段就可以求值。编译器不会分配单独的内存来存储常量表达式,而是将常量表达式的值和代码一起放在代码区,会被硬编码到指令中,不能寻址。
引用和指针都不能绑定到无法寻址的临时数据。
标签:end 调用 编码 main 寻址 数组 赋值 多级 ons
原文地址:https://www.cnblogs.com/xiaobaizzz/p/12350589.html