首页 > 编程知识 正文

什么是一级指针和二级指针,c++二级指针用法

时间:2023-05-04 02:02:41 阅读:227941 作者:2789

   本来想叫这篇文章为“深入理解C指针”,后来想想,还是要谦卑一些,毕竟C指针确实博大精深,是C语言的精髓之一。先说一些说一些简单的背景知识。

    任何 架构的CPU, 程序的运行都是需要内存的,所谓内存,内存这个概念听起来简单,想要说的特别通透也是挺难的,我们姑且简单的打个比方:内存就相当于一个房子里的无数个抽屉,每个 抽屉都是有一个编号来标识的,每个抽屉一般有8个隔间,也就是能存储8个bit位,抽屉的编号就是“内存地址”,这里就有了第一个概念:

每8个bit,也就是1个字节,对应一个地址,也就是地址的最小单位是字节。

    对于普通变量,比如 int a = 10,我们可以直接通过a这个符号,实现 对这个变量的引用和操作,对应的就是赋值和复制。这里就不详细解释了,相信大多数人都能理解。

一、 一级指针

    我们在理解一级指针的时候,首先要牢记一句话: 一级指针指向的内容一定是一个“地址”,而不是普通变量。我们在使用的时候,对一级指针赋值,一定要给一个  地址,而不是变量,例如:

int a = 10;int *p1;p1 = &a;

  上面的代码,我们没有在定义*p1的时候直接初始化赋值,而是在 下一行进行赋值,这说明了一个容易忽略的细节,那就是:

   一级指针本身p1本身也是一个变量,它跟 a 是 一样的,只不过指向的内容不同而已,a指向的是一个具体的值,而p1则是指向a的内存地址。

 我们对p1的赋值和各种其他操作(不带*),都是伴随着“内存地址”的。

二、 指针引用操作符“ * ”

   不管是一级指针还是后面要讲的二级指针,都会使用一个操作符“ * ”,我们通过一个指针访问她所指向的地址过程称为“ 间接访问”或者解引用指针,这个用于执行间接访问的操作符就是 “*”,这个“*”有两层 意思:

(1)定义一个指针时,必须添加 * ,表示这是一个指针,注意,在第一次定义是,这个*不是引用的功能。

(2) 其他任何情况下,* 都是表示引用的功能,也就是说通过 * 告诉编译器,我要取这个指针所指向的地址里的内容,也就是说这个过程是,先根据 指针的值,这个指针的 值,不是普通 变量值,而是一个 地址,然后再通过这个地址,获取对应的值。所以这就叫 “间接访问”,或者叫“解指针”。

三、指针的地址

     前面讲到, 指针指向的内容是个“内存地址”,指针本身也是一个变量,而不管是一级指针、二级指针 还是多级指针。内存只有一块,所有的 指针本身,也会分配一个内存地址,用于存放指针内容。如 下所示:

   注:前面讲到一个地址最小 表示一个字节,当然也可以表示2个、4个、8个字节,只不过是 连续的,所以上图中0x11111111内容是合法的, 只不过会占用0x11111111~0x11111114。

    这个图如果仔细琢磨可以知道,内存不管大还是小,都只是连续的一块。所以内存地址也是固定的,如果是4G的 内存,那么地址范围就是0x00000000~0xFFFFFFFF。但是我们在内存区域内存放“地址值”,然后通过这个地址值,就可以实现对变量的间接操作。有人说,为什么不直接去操作上面的a呢?原因是很多时候,不是简单的一个a,而是各种其他类型,我们通过对“地址值”的间接操作,有时候会及其的方便。

四、二级指针

    牢记一句话,二级指针也是一个变量,它 指向的一定是“指针的地址”。对比下,一级指针指向的是普通变量的地址,二级指针指向的是“一级指针的地址”,以此类推,三级指针对应的是“二级指针的地址”。举例代码如下:

#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]) {//定义普通变量、一级指针、二级指针,不初始化 int a;int *p1;int **p2;//对前面的普通指针、一级指针、二级指针进行初始化赋值 a = 10;p1 = &a;p2 = &p1;printf("a = %dn", a); printf("&a = %dn", &a); printf("p1 = %dn", p1);printf("*p1 = %dn", *p1);printf("p2 = %dn", p2);printf("*p2 = %dn", *p2);printf("**p2 = %dn", **p2);printf("&p2 = %dn", &p2);return 0;}

  程序运行的结果如下:

 上面的代码中,故意将普通变量、一级指针、二级指针的定义和初始化赋值分开,再次验证说明了一个 容易忽略的概念:

     不管是普通变量,一级指针、二级指针。。。多级指针,都是普通变量,指针只有在定义的时候,才会带*,有几个*代表就是几级指针,我们在对这个指针进行赋值的时候, 不需要带*,不管是一级还是多级,一律将所有*去掉。

     而且一定注意,理解起来,先有定义确定变量类型,也就是说前面的a、p1、p2,虽然都是字母,但是只要定义不同,那么他们代表的含义就不同。如果定义是普通变量int a(没有*),那么a就是普通变量,而定义是一级指针int *p1,那么p1就是一级指针, 对她赋值,就必须是一个变量的地址。定义int **p2,那么p2就是二级指针,对p2的赋值,必须是一个指针的 地址。我们在使用的时候, 一定牢记这些。是什么类型变量,就要用什么规定来初始化操作。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。