首页 > 其他分享 >【三级指针、二级指针、一级指针、指针值】原理+超直白说明/总结(当然,还是会有点涩~)

【三级指针、二级指针、一级指针、指针值】原理+超直白说明/总结(当然,还是会有点涩~)

时间:2024-06-09 17:57:59浏览次数:15  
标签:二级 arr 直白 函数 指向 一级 三级 指针

看不懂的原理及区别

在计算机编程中,指针是一个变量,其值为另一个变量的地址。指针的级别是根据它们所指向的对象类型来定义的。当我们谈论“一级指针”、“二级指针”和“三级指针”时,我们实际上是在讨论指针所指向的对象的类型。

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 的地址

原理及区别

  1. 原理:指针的级别本质上是由它所指向的对象的类型决定的。一级指针指向基本数据类型或复合数据类型的地址,二级指针指向一级指针的地址,三级指针指向二级指针的地址,以此类推。
  2. 区别:
    2.1 功能:不同级别的指针在功能上有所不同。一级指针主要用于访问和操作数据,二级指针和三级指针则更多地用于处理指针本身(如动态内存分配、传递指针数组等)。
    2.2 复杂性:随着指针级别的增加,程序的复杂性也会增加。使用高级别指针时需要更多的注意力和谨慎,以避免出现错误(如野指针、内存泄漏等)。
    2.3 应用场景:不同级别的指针在应用场景上也有所不同。一级指针是最常见的,几乎在所有的程序中都会使用到;二级指针在处理动态分配的数组、链表等数据结构时非常有用;三级指针则较少使用,但在某些复杂的数据结构和算法中可能会遇到。

超直白说明/总结(当然,还是会有点涩~)

毕竟它是指针

指针值

指针值记录的是一个地址,这个地址指向一块内存;

指针(一级指针)

指针指向指针值,可以通过解引用得到指针值,也可以通过解引用修改指针的指向,也就是指向一个新的指针值;
函数所谓的传递一级指针,其实是传递的指针值;

二级指针

二级指针指向一级指针,所以可以修改二级指针的指向,使它指向一个新的一级指针;
二级指针解引用得到一级指针,一级指针解引用得到指针值,通过一级指针修改指向,也就是让一级指针指向新的指针值,使二级指针双重解引用指向的值发生变化;
函数所谓的传递二级指针,其实传递的是二级指针值,解引用后才是一级指针;
当我们想要在函数的函数里面修改指针值时,需要在函数的函数里面修改一级指针,而要在函数的函数里面得到一级指针,我们需要传递二级指针值,也就是说,我们需要传递二级指针。这一过程也就是传说中的—动态内存管理(掩面而泣);

三级指针

三级指针指向二级指针,所以可以修改三级指针的指向,使它指向一个新的二级指针balabal~~

总结

当我们想要修改某个指针指向的指针值时,如果是当前函数(一级函数),则可以直接修改;
当我们想要在函数的函数(二级函数)里面修改时,则可以通过传递二级指针修改;
当我们想要在函数的函数的函数(三级函数)里面修改时,则可以通过传递三级指针修改;
balbal~~
记住,你虽然代码传递的是某级指针,但原理只是传递某级指针值,更简要的说,函数参数传递的本质是“值传递”

本质—函数参数传递的本质是“值传递”!!!

本质—函数参数传递的本质是“值传递”!!!

本质—函数参数传递的本质是“值传递”!!!

**说三遍!!!

标签:二级,arr,直白,函数,指向,一级,三级,指针
From: https://blog.csdn.net/afghjhg/article/details/139495353

相关文章

  • 深入理解指针(三)
    一、指针运算1.1指针+-整数下面我们来看一个指针加整数的例子:#include<stdio.h>intmain(){   intarr[10]={1,2,3,4,5,6,7,8,9,10};   int*p=&arr[0];   inti=0;   intsz=sizeof(arr)/sizeof(arr[0]);   for(i=0;i<sz;i......
  • C语言中的指针(1)
    目录指针是什么?指针变量&和*操作符指针变量的类型指针变量的大小指针变量类型的意义void*指针const修饰指针const修饰变量const修饰指针变量指针运算•指针+-整数•指针-指针​编辑​编辑​编辑•指针的关系运算野指针概念成因指针未初始化​编......
  • C语言指针
    1、内存和地址1.1内存 内存:内存划分为一个个内存单元,每个内存单元的大小是一个字节,是8个比特位。 变量创建的本质是在内存中申请空间,每个字节都有自己的编号(地址),编译器是通过地址来寻找内存单元的。内存单元的编号==地址==指针1.2理解编址CPU访问内存中的某个字节空间,......
  • Linux下的C语言编程(指针)
    目录1一级指针1.1定义1.2指针的内存大小1.3指针的偏移1.3.1加法偏移1.3.2减法偏移2二级指针2.1定义2.2如何理解二级指针3三级指针3.1定义4数组和指针的关系4.1一维数组与指针的关系4.1.1数组名的性质4.1.2数组名与指针的地址偏移4.2二维数组与......
  • [OI] 指针与迭代器
    取地址与解引用一般来说,我们有一个取地址符&可以返回该变量的地址.intmain(){ inta; cout<<&a;}0x6ffe1c如果我们现在有一个地址,我们还可以对它进行解引用*,来返回这个地址上的值.intmain(){ inta=5; cout<<&a<<endl; cout<<*(&a);}0x6ffe1c5从这里可以......
  • JAVA踩坑日记之超隐蔽但常见空指针问题
    今天遇到一个特别难以发现的空指针问题代码如下:BookDetailDtobookDetail=metaDataDetailDao.findBookDetailById(bookId);if(null==bookDetail){bookDetail=metaDataTempDao.findBookDetailById(bookId);}//如果......
  • 【C语言】指针(4)
    一、回顾 在这之前,我们学习了很多关于指针的内容,我们先在这里简单的回顾一下。1、一级指针int*p;  --整形指针-指向整形的指针 char*p;...void*p;......2、二级指针int**p; char**p;...3、数组指针--指向数组的指针int(*p)[];intmain(){......
  • 快速C++中的入门智能指针
    ✨前言✨......
  • 习题整理《C++17从入门到精通》第五章-复合类型:数组、指针和引用
                                                            //复习用,如有错误,请指正1.下面程序的输出是什么?#include<iostream>usingnamespacestd;intmain(){intx=10;int&ref=x;......
  • C/C++ 引用和指针的区别及使用场景
    C和C++中的引用(reference)和指针(pointer)都是用于间接访问变量的工具,但它们之间存在一些关键的区别和使用场景。一、什么是引用(Reference)?引用是只有在C++中才存在的概念,C语言是没有引用的。定义:引用是变量的别名,换句话说,就是为其起一个外号。一旦引用被初始化为一个变量,就......