二重指针、二维数组及二者如何进行赋值
如果已经定义了一个指针类型,我们再定义一个指针,用于指向已经定义的指针变量,后面定义的指针变量就是一个指向指针的指针变量,简称指向指针的指针,这样的指针也称二重(级)指针。
一、一般情况的例子:
#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放出来,就是希望大家指点一下,看看我这个总结是不是正确的。
二重指针、二维数组及二者如何进行赋值相关推荐
- C语言 指针+二维数组详解 (应付期末、考研的最强笔记,建议收藏)
哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...
- C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)
一级指针 int *p; //表示定义一个int型(4字节)的指针p &p //表示p自身的地址位置 p ...
- 指针 二维数组元素引用
二维数组元素指针引用 1.定义 2.数组指针和指针数组的区别 1.二维数组可以理解为是一个一维数组,不过每个数组元素又是一个一维数组 int a[2][3]={{1,2,3},{4,5,6}}; 可以 ...
- 【C++】二维数组的行指针和列指针
在C++中,数组与指针有密切的关系.任何通过数组和下标实现的表达式可等价地通过指针和偏移量实现.下面首先介绍一维数组与指针的关系,之后介绍二维数组的行指针和列指针. 1.一维数组和指针 定义一个长度为 ...
- 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )
文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...
- Linux C编程---指针数组简析(二维数组、多级指针)
讲到指针和数组,先给大家看一道例题: 题目:填空练习(指向指针的指针) 1.程序分析: 2.程序源代码: main() { char *s[]={"man","woman ...
- 【C语言进阶深度学习记录】三十 二维数组与二维指针
文章目录 1 二维指针(指向指针的指针) 2 二维数组 3 二维数组的类型 3.2 如何动态申请二维数组 4 总结 1 二维指针(指向指针的指针) 指针的本质是变量 指针的指针是保存指针变量的地址.如 ...
- C/C++ 指针数组、二维数组
一. 二维数组 1> 初始化 int a[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} }; // 里面的括号是 {} , 而不是() 2> 将二维数组当做一维数 ...
- c语言二维数组 ppt,C语言二维数组与指针.ppt
C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...
- c++ 二维数组_C|数形结合理解数组指针、指针数组、一级指针来遍历二维数组
二维数组本质是也是线性存储的一维数组,各元素都是相对于基地址(首地址)的偏移,只是逻辑上的维度区分而已.或者可以理解为数组的数组,也就是说,n维数组的元素是一个n-1维数组. 需要注意的是,多维数组名 ...
最新文章
- python 程序流程控制结构-【笔记】《python语言程序设计》——程序的控制结构...
- php+MySql注入非暴力爆字段名
- 使用代码将指定的product加入新建的transaction
- Refusing to install package with name “vue-i18n“ under a package
- ASP.NET 2.0中发送电子邮件
- Linux-oled096驱动硬件分析
- redis学习基本命令
- 亚马逊CEO贝索斯将飞往太空;字节跳动获得“字节汽车”商标;谷歌被法国反垄断机构罚款 2.2 亿欧元|极客头条...
- canon lbp6200 macos下单面双面打印设置
- 网页端播放视频加速方法
- 一个开源数据分析平台的搭建方法
- python猴子分桃子的数学题_小学奥数猴子分桃练习及答案【三篇】
- Linux的10个彩蛋
- 利用jsoup爬取百度网盘资源分享连接(多线程)
- 刘二大人 PyTorch深度学习实践 笔记 P6 逻辑斯蒂回归
- border-image边框背景不变形九宫格
- 我的程序员之路(15)——2019年前半年总结
- c语言机器人编程软件,诺宝RC|免费版机器人编程软件下载_最火软件站
- 乐鑫WiFi单火线智能开关方案,传统开关实现智能升级
- tiptop开发webservice详细步骤
热门文章
- 上周热点回顾(10.15-10.21)
- Atitit 获取ip的http标头 目录 1.1. REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP	1 1.2. HTTP_CLIENT_IP 客户ip。握手ip	1 1.3
- Atitit nosql的概念与attilax的理解 目录 1. 常见的nosql 二、Redis,Memcache,MongoDb的特点 1 HBase	1 2. Nosql的核心nosql	1
- Atitit uke证件编码规范与范本
- Atitit 深入了解UUID含义是通用唯一识别码 (Universally Unique Identifier),
- Atitit.Gui控件and面板----web server区----- web服务器监控面板and控制台条目
- atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug
- paip.-Djava.library.path -Djava.ext.dirs= 的区别
- 国人常用密码TOP100 FROM THISITE
- ECLIPSE远程调试TOMCAT.