概述
C++中的指针和引用都是变量,用于间接访问和修改变量的工具。
-
指针
是一个变量,它存储了另一个变量的内存地址。指针变量本身也需要分配内存空间。 -
引用
引用变量则是原变量的别名,它提供了对另一个变量的直接访问。它不需要额外的内存空间来存储地址。
这是因为,
在编译时,编译器会将引用变量和原变量绑定在一起,它们实际上指向同一个内存地址。
在程序运行时,当我们使用引用时,编译器会自动将引用转换为对原变量的指针内存地址,并在需要访问原变量时使用该指针内存地址。
因此,引用变量并不需要额外的内存空间来存储它所指向的变量的地址。相反,它直接使用原变量的地址来访问该变量 -
对象
是一种复合数据类型,它将多个变量组合在一起,并提供了一组方法来操作这些变量。对象可以通过指针或引用进行访问和修改,也可以直接进行访问和修改。
Java中
- 引用
是一种数据类型,它提供了对对象的直接访问。在Java中,对象是通过new操作符动态分配内存而创建的。Java中没有指针的概念,因此不能像C++中那样直接访问和修改内存地址。
对象访问
c++
3中方式
int main() {
MyClass obj; // 自动变量创建对象 ,在栈上面分配内存,离开函数作用域后自动回收内存
obj.my_var = 42;//直接对象访问
obj.my_func();
MyClass* ptr = &obj; //指针访问对象
ptr->my_var = 99;
ptr->my_func();
MyClass& ref = obj;// 引用访问访问对象
ref.my_var = 123;
ref.my_func();
return 0;
}
java
仅一种方式
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice");//只能够通过引用访问到对象
person.sayHello();
}
}
参数传递
- 值传递:
将变量的值复制一份,并将其传递给方法或函数。在方法或函数中对该参数进行修改不会影响原始变量。 - 指针传递:
将指向变量的指针复制一份,并将其传递给方法或函数。在方法或函数中对该指针所指向的变量进行修改将影响原始变量。 - 引用传递:
将变量的别名复制一份,并将其传递给方法或函数。在方法或函数中对该别名所指向的变量进行修改将影响原始变量。
c++
对象可以进行值传递,这意味着会拷贝整个对象的副本,并将副本传递给函数。
指针和引用可以指向基本类型,因此基本类型可以进行指针传递和引用传递。
java
值传递,引用传递
对象只有引用传递,不会将整个对象的副本传递给函数。
基本类型只有值传递
在C++中
对象是一个实体,它具有属性和行为;
指针是一个变量,它存储的是一个内存地址,可以通过该地址访问到该地址上存储的数据;
引用是一个别名,它是一个已存在对象的别名。C++中的指针和引用都可以用于函数参数传递、返回值和对象成员变量等场景。