📜  CC++ 指针与Java引用(1)

📅  最后修改于: 2023-12-03 14:59:53.936000             🧑  作者: Mango

CC++ 指针与Java引用

指针

在 C 和 C++ 中,指针是一种非常重要的数据类型,它存储内存地址的值。通过指针,程序可以直接访问和修改内存中的数据,从而实现更加高效和灵活的操作。指针不仅可以指向单个变量的地址,还可以指向数组和函数的地址。

指针的声明和使用

在 C 和 C++ 中,指针的声明使用 * 运算符,例如:

int *p;

这个语句声明了一个名为 p 的指针变量,它可以指向一个整数类型的值。要给指针赋值,需要使用 & 运算符取得某个变量的地址,例如:

int x = 10;
int *p = &x;

这个语句将 p 指向了 x 变量的地址。要使用指针访问内存中的值,需要使用 * 运算符,例如:

int y = *p;

这个语句将内存中 p 所指向的值取出来赋给 y 变量。可以通过修改指针的值,来改变所指向的变量的值,例如:

*p = 20;

这个语句将 x 的值改为了 20。

指针的高级用法

除了基本的指针可以直接存储变量的地址外,还有一些高级的指针用法,可以进一步优化程序的效率和灵活性:

  • 指向数组的指针:可以使用指针访问数组中的元素,例如:
int a[10] = {1, 2, 3, 4, 5};
int *p = a; // 将指针指向数组的第一个元素
int x = *(p + 2); // 取出数组中下标为 2 的元素的值
  • 指向指针的指针:在 C 和 C++ 中,可以使用双重指针来传递指针参数或者创建指向指针的数组,例如:
int x = 10;
int *p = &x;
int **q = &p;
int y = **q; // 取出 p 指向的 x 的值

int a[3] = {1, 2, 3};
int *b[3] = {a, a + 1, a + 2}; // 创建指向指针的数组
int z = *b[1]; // 取出数组中下标为 1 的元素指向的值
  • 指针与函数:在 C 和 C++ 中,可以将函数的参数和返回值设置为指针类型,从而实现指针和函数的结合,例如:
// 交换两个整数变量的值
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int x = 10, y = 20;
swap(&x, &y); // 交换 x 和 y 的值

// 查找字符串中的最大值和最小值
void get_max_min(char **str, int n, char **max, char **min) {
    *max = *min = str[0];
    for (int i = 0; i < n; i++) {
        if (strcmp(str[i], *max) > 0) {
            *max = str[i];
        }
        if (strcmp(str[i], *min) < 0) {
            *min = str[i];
        }
    }
}

char *str[3] = {"hello", "world", "java"};
char *max, *min;
get_max_min(str, 3, &max, &min); // 查找最大值和最小值
引用

Java 中没有指针的概念,相应地,引用是一种与指针类似的机制,用于访问和操作对象。在 Java 中,引用是一种特殊的变量类型,它不直接存储对象的数据,而是存储对象在内存中的地址。Java 中的所有数据类型都是对象,因此,引用可以用来引用任何对象。

引用的声明和使用

在 Java 中,引用的声明和基本数据类型的声明类似,例如:

Object obj; // 声明一个 Object 类型的引用

这个语句声明了一个名为 obj 的引用变量,它可以引用任何 Object 类型的对象。要创建一个对象并用引用指向它,需要使用关键字 new,例如:

Object obj = new Object();

这个语句创建了一个新的 Object 类型的对象,并将 obj 引用指向该对象。要通过引用访问对象的属性和方法,只需要使用 . 运算符即可,例如:

String str = "hello";
int len = str.length(); // 获取字符串的长度

这个语句通过引用 str 访问了字符串的 length() 方法,并将返回值赋给 len 变量。可以通过修改对象的状态,来改变对象在内存中的数据,例如:

StringBuilder sb = new StringBuilder("hello");
sb.append("world");
String str = sb.toString(); // 获取修改后的字符串

这个语句通过引用 sb 调用了 append() 方法,向字符串中追加了一个单词 world,然后将修改后的字符串以字符串形式返回。

引用的高级用法

在 Java 中,除了基本的引用,还有一些高级的引用用法,可以进一步拓展引用的使用场景和方式:

  • 引用类型的参数:在 Java 中方法的参数可以是基本数据类型和对象类型,对于对象类型的参数来说,实际上传递的是对象的引用,因此传递的是指向对象的指针,例如:
// 交换两个整数变量的值
public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

int[] arr = {10, 20, 30};
swap(arr, 0, 2); // 交换 arr 数组中下标 0 和下标 2 的元素的值
  • 引用类型的返回值:在 Java 中方法的返回值可以是基本数据类型和对象类型,对于返回对象类型的方法来说,实际返回的是对象的引用,因此返回的是指向对象的指针,例如:
// 查找字符串中的最大值和最小值
public static String[] getMaxMin(String[] arr) {
    String max = arr[0], min = arr[0];
    for (int i = 0; i < arr.length; i++) {
        if (arr[i].compareTo(max) > 0) {
            max = arr[i];
        }
        if (arr[i].compareTo(min) < 0) {
            min = arr[i];
        }
    }
    String[] res = {max, min};
    return res;
}

String[] arr = {"hello", "world", "java"};
String[] res = getMaxMin(arr); // 获取最大值和最小值
  • 引用类型的自动装箱拆箱:在 Java 中,可以将基本数据类型自动转换为对应的包装类对象,称为自动装箱;也可以将包装类对象自动转换为对应的基本类型,称为自动拆箱。这些转换都是通过引用来实现的,例如:
Integer a = 10;
int b = a; // 自动拆箱
a = b; // 自动装箱
总结

尽管 CC++ 指针和 Java 引用看起来有所不同,但本质上它们都是存储内存地址的变量类型,都能够更加灵活地操作内存和对象。在实际开发中,程序员需要根据自己的需求和开发环境,选择合适的指针或者引用来实现高效、可维护的代码。