如果已经定义了一个指针类型,我们再定义一个指针,用于指向已经定义的指针变量,后面定义的指针变量就是一个指向指针的指针变量,简称指向指针的指针,这样的指针也称二重()指针

一、一般情况的例子:

#include <iostream>using namespace std;int main(){int **p;int c = 2;int *b = &c;p = &b;cout << p << "\n" <<endl;
}

注意,因为p是个指针,所以必须p = &b,而不能p=b。

深入解释:(来自:指针数组和多重指针_JunkChen-CSDN博客)

char **p

p 前面有两个 * 号。* 运算符的结合性是从右到左的。因此 **p 相当于 *(*p) , *p 是指针变量的定义形式。可以分为两部分看: char * 和 (*p) ,后面的 (*p) 表示 p 是指针变量,前面的 char * 表示 p 是指向 char * 型的数据,即,p中存储的是char *型数据的地址,其中char *表示char类型数据的指针,所以p存储的是char *型指针的地址,所以前面p=&b而不是p=b。也就是说, p 指向一个字符型指针变量(这个字符型指针变量指向一个字符型数据)。如果引用 *p , 就得到 p 所指向的字符指针变量的值。

二、与一维数组结合的情况

int m[3] = {1, 2, 3};
int *d = m;
int **p;
p = &d;

m是一维数组的首元素地址,也就是指针值,所以可以直接赋值给d。

三、与二维数组结合的情况

3.1 有如下定义:

int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。
若有:
int *p=a[0];
则数组a的元素a[1][2]对应的指针为:p+1*4+2
元素a[1][2]也就可以表示为:*( p+1*4+2)
用下标表示法,a[1][2]表示为:p[1*4+2]

3.2 特别说明:

对上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同,a[0]是一维数组的名字,它指向的是a[0]数组的首元素(a[0][0])的地址,对其进行“*”运算,得到的是一个数组元素值,即a[0]数组首元素值,因此,*a[0]与a[0][0]是同一个值;而a是一个二维数组的名字,它的每一个元素都是一个行数组,因此,它的指针移动单位是“行”,所以a+i指向的是第i个行数组,即指向a[i]。对a进行“*”运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值。
(1)当用int *p;定义指针p时,p的指向是一个int型数据的地址,因此,用a[0]对p赋值是正确的,而用a对p赋值是错误的。
(2)当用int **p定义指针p时,p的指向是一个int *型的地址,但是a表示的是一个一维数组(a[0])的地址,a[0]表示的是一个数值(a[0][0])的地址,都不是int *型(int 型数值的地址的地址)的地址,所以不能用a或者a[0]对p进行赋值。
但是可以通过下面的方法赋值:

int **p;
int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
int *e;
e = a[0];
​​​​​​​p = &e;

3.3 错误的情况

因为不能直接对地址取地址,所以不能使用下面的方法直接赋值:

int **p;
int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
//int *e;
//e = a[0];
​​​​​​​p = &a[0];

即必须经过中间变量e才行,因为会给变量e分配存储空间。

3.4 图解如下:

四、总结

结合一、二、3.2、3.3中的例子以及3.4的图解

就可以总结出来一个规律:二重指针变量必须指向一重指针变量的地址,任何其他的地址都不行。必须使用一重指针变量才能给二重指针变量赋值

五、参考:

指针数组和多重指针_JunkChen-CSDN博客
C/C++——二维数组与指针、指针数组、数组指针(行指针)、二级指针的用法 - 怪猫佐良 - 博客园

之所以把这篇blog放出来,就是希望大家指点一下,看看我这个总结是不是正确的。

二重指针、二维数组及二者如何进行赋值相关推荐

  1. C语言 指针+二维数组详解 (应付期末、考研的最强笔记,建议收藏)

    哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...

  2. C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)

    一级指针 int *p;            //表示定义一个int型(4字节)的指针p &p                 //表示p自身的地址位置 p                  ...

  3. 指针 二维数组元素引用

    二维数组元素指针引用 1.定义 2.数组指针和指针数组的区别 1.二维数组可以理解为是一个一维数组,不过每个数组元素又是一个一维数组 int a[2][3]={{1,2,3},{4,5,6}}; 可以 ...

  4. 【C++】二维数组的行指针和列指针

    在C++中,数组与指针有密切的关系.任何通过数组和下标实现的表达式可等价地通过指针和偏移量实现.下面首先介绍一维数组与指针的关系,之后介绍二维数组的行指针和列指针. 1.一维数组和指针 定义一个长度为 ...

  5. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...

  6. Linux C编程---指针数组简析(二维数组、多级指针)

    讲到指针和数组,先给大家看一道例题: 题目:填空练习(指向指针的指针) 1.程序分析: 2.程序源代码: main() { char *s[]={"man","woman ...

  7. 【C语言进阶深度学习记录】三十 二维数组与二维指针

    文章目录 1 二维指针(指向指针的指针) 2 二维数组 3 二维数组的类型 3.2 如何动态申请二维数组 4 总结 1 二维指针(指向指针的指针) 指针的本质是变量 指针的指针是保存指针变量的地址.如 ...

  8. C/C++ 指针数组、二维数组

    一. 二维数组 1> 初始化 int a[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} }; // 里面的括号是 {} , 而不是() 2> 将二维数组当做一维数 ...

  9. c语言二维数组 ppt,C语言二维数组与指针.ppt

    C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...

  10. c++ 二维数组_C|数形结合理解数组指针、指针数组、一级指针来遍历二维数组

    二维数组本质是也是线性存储的一维数组,各元素都是相对于基地址(首地址)的偏移,只是逻辑上的维度区分而已.或者可以理解为数组的数组,也就是说,n维数组的元素是一个n-1维数组. 需要注意的是,多维数组名 ...

最新文章

  1. python 程序流程控制结构-【笔记】《python语言程序设计》——程序的控制结构...
  2. php+MySql注入非暴力爆字段名
  3. 使用代码将指定的product加入新建的transaction
  4. Refusing to install package with name “vue-i18n“ under a package
  5. ASP.NET 2.0中发送电子邮件
  6. Linux-oled096驱动硬件分析
  7. redis学习基本命令
  8. 亚马逊CEO贝索斯将飞往太空;字节跳动获得“字节汽车”商标;谷歌被法国反垄断机构罚款 2.2 亿欧元|极客头条...
  9. canon lbp6200 macos下单面双面打印设置
  10. 网页端播放视频加速方法
  11. 一个开源数据分析平台的搭建方法
  12. python猴子分桃子的数学题_小学奥数猴子分桃练习及答案【三篇】
  13. Linux的10个彩蛋
  14. 利用jsoup爬取百度网盘资源分享连接(多线程)
  15. 刘二大人 PyTorch深度学习实践 笔记 P6 逻辑斯蒂回归
  16. border-image边框背景不变形九宫格
  17. 我的程序员之路(15)——2019年前半年总结
  18. c语言机器人编程软件,诺宝RC|免费版机器人编程软件下载_最火软件站
  19. 乐鑫WiFi单火线智能开关方案,传统开关实现智能升级
  20. tiptop开发webservice详细步骤

热门文章

  1. 上周热点回顾(10.15-10.21)
  2. Atitit 获取ip的http标头 目录 1.1. REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP 1 1.2.  HTTP_CLIENT_IP 客户ip。握手ip 1 1.3
  3. Atitit nosql的概念与attilax的理解 目录 1. 常见的nosql 二、Redis,Memcache,MongoDb的特点 1 HBase 1 2. Nosql的核心nosql 1
  4. Atitit uke证件编码规范与范本
  5. Atitit 深入了解UUID含义是通用唯一识别码 (Universally Unique Identifier),
  6. Atitit.Gui控件and面板----web server区----- web服务器监控面板and控制台条目
  7. atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug
  8. paip.-Djava.library.path -Djava.ext.dirs= 的区别
  9. 国人常用密码TOP100 FROM THISITE
  10. ECLIPSE远程调试TOMCAT.