看不懂的原理及区别
在计算机编程中,指针是一个变量,其值为另一个变量的地址。指针的级别是根据它们所指向的对象类型来定义的。当我们谈论“一级指针”、“二级指针”和“三级指针”时,我们实际上是在讨论指针所指向的对象的类型。
1. 一级指针
一级指针(或称为普通指针)是最常见的指针类型。它存储了一个变量的地址,这个变量可以是任何基本数据类型(如 int、float、char 等)或复合数据类型(如结构体、数组等)的地址。
例如:
int x = 10;
int *ptr = &x; // ptr 是一个一级指针,指向 x 的地址
2. 二级指针
二级指针是一个指针,它指向的是另一个指针的地址,即它存储了一个指针的地址。二级指针常用于处理动态分配的数组、链表等数据结构,以及作为函数的参数来传递指针数组。
例如:
int *arr = malloc(10 * sizeof(int)); // arr 是一个一级指针,指向动态分配的内存
int **ptr_to_arr = &arr; // ptr_to_arr 是一个二级指针,指向 arr 的地址
3. 三级指针
三级指针是一个指针,它指向的是另一个二级指针的地址。虽然三级指针在实际编程中较少使用,但在某些复杂的数据结构和算法中可能会遇到。
例如:
int **arr_of_ptrs = malloc(10 * sizeof(int *)); // arr_of_ptrs 是一个二级指针,指向一个指针数组
int ***ptr_to_arr_of_ptrs = &arr_of_ptrs; // ptr_to_arr_of_ptrs 是一个三级指针,指向 arr_of_ptrs 的地址
原理及区别
- 原理:指针的级别本质上是由它所指向的对象的类型决定的。一级指针指向基本数据类型或复合数据类型的地址,二级指针指向一级指针的地址,三级指针指向二级指针的地址,以此类推。
- 区别:
2.1 功能:不同级别的指针在功能上有所不同。一级指针主要用于访问和操作数据,二级指针和三级指针则更多地用于处理指针本身(如动态内存分配、传递指针数组等)。
2.2 复杂性:随着指针级别的增加,程序的复杂性也会增加。使用高级别指针时需要更多的注意力和谨慎,以避免出现错误(如野指针、内存泄漏等)。
2.3 应用场景:不同级别的指针在应用场景上也有所不同。一级指针是最常见的,几乎在所有的程序中都会使用到;二级指针在处理动态分配的数组、链表等数据结构时非常有用;三级指针则较少使用,但在某些复杂的数据结构和算法中可能会遇到。
超直白说明/总结(当然,还是会有点涩~)
毕竟它是指针
指针值
指针值记录的是一个地址,这个地址指向一块内存;
指针(一级指针)
指针指向指针值,可以通过解引用得到指针值,也可以通过解引用修改指针的指向,也就是指向一个新的指针值;
函数所谓的传递一级指针,其实是传递的指针值;
二级指针
二级指针指向一级指针,所以可以修改二级指针的指向,使它指向一个新的一级指针;
二级指针解引用得到一级指针,一级指针解引用得到指针值,通过一级指针修改指向,也就是让一级指针指向新的指针值,使二级指针双重解引用指向的值发生变化;
函数所谓的传递二级指针,其实传递的是二级指针值,解引用后才是一级指针;
当我们想要在函数的函数里面修改指针值时,需要在函数的函数里面修改一级指针,而要在函数的函数里面得到一级指针,我们需要传递二级指针值,也就是说,我们需要传递二级指针。这一过程也就是传说中的—动态内存管理(掩面而泣);
三级指针
三级指针指向二级指针,所以可以修改三级指针的指向,使它指向一个新的二级指针balabal~~
总结
当我们想要修改某个指针指向的指针值时,如果是当前函数(一级函数),则可以直接修改;
当我们想要在函数的函数(二级函数)里面修改时,则可以通过传递二级指针修改;
当我们想要在函数的函数的函数(三级函数)里面修改时,则可以通过传递三级指针修改;
balbal~~
记住,你虽然代码传递的是某级指针,但原理只是传递某级指针值,更简要的说,函数参数传递的本质是“值传递”;