今天看c++primer第六章,有这部分的内容,脑子有点糊涂了,看了几篇博客,自己敲了下,记录一下备忘。

二级指针:

int **p;

二维数组:

int p[10][10];
char q[10][10];

指针数组:

int *p[10];

数组指针:

int (*p)[10];

咋区分后面这俩呢,记住[]的优先级比*高,所以上面写法,p先和后面的[10]结合,也就是p首先是个10个元素的数组,那么前面的int *就是元素类型,也就是存了10个int指针的数组。

那么下面这个写法把 * p括起来,那首先p就是个指针,指向什么呢,还剩下前面的int和后面的[10],也就是这个指针指向10个int的数组。

归纳一下,先看变量名跟前后谁结合,结合之后就可以判断变量类型。然后把这部分拿走,看剩下的是什么。

然后另外一点,int * p1[10]这是个指针数组,int * * p2是个二级指针。p1[0]、p1[1]、p1[2]…等都代表不同数组的地址。数组首地址和指针相同,故p1和p2意义一样。* p1得到的是p1的第一个元素,是一个int指针。* p2得到的也是一个int指针,两者一致。

证明:下面代码可以运行无报错

int f(int **p)
{
return 0;
} int main()
{
int* q[10];
f(q);
}

但如果把q定义为二维数组、数组指针等等就都会报错。

二维数组为什么不行:例如int q[10][10];,q就不是个指针,q不能自增自减,这显然不能转化为二级指针。

数组指针为什么不行:例如int (*q) [10];,q确实是指针了,但q+1和q在内存距离差多少呢,是差10个int,而p和p+1差就差1个int(4个字节)。下图为证,故也不能替换。

这里q是指针数组,等同于二级指针,相邻内存差4,1个指针占4字节,也就是差距一个指针变量的距离。



下面q是数组指针,可以看见q和q+1内存差距28,十进制就是40,即10个int的空间。



所以数组指针和二级指针(指针数组)为什么不能混用的原因就很明显了,有疑问可以评论区交流,今天就先总结到这里。 2019年10月22日 00:31:48

唠唠C++二级指针、二维数组、指针数组、数组指针等的区分的更多相关文章

  1. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  2. 洛谷 P1972 [SDOI2009]HH的项链-二维偏序+树状数组+读入挂(离线处理,思维,直接1~n一边插入一边查询),hahahahahahaha~

    P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  3. int (*p)[4] p 是二级指针 二维数组 二级指针 .xml

    pre{ line-height:1; color:#2f88e4; background-color:#e9ffff; font-size:16px;}.sysFunc{color:#3d7477; ...

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

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

  5. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  6. C++笔记-数组指针/二维数组转换指针

    参考资料: 1. 作者 BensonLaur  :https://www.cnblogs.com/BensonLaur/p/6367077.html 2. https://blog.csdn.net/ ...

  7. C++ 指针二维数组, C++二维指针数组笔记

    C++ 二维动态数组 一. 已知第一维 #include <iostream> using namespace std; int main(int argc, char const *ar ...

  8. c语言中数组,指针数组,数组指针,二维数组指针

    1.数组和指针 ] = {,,,,};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0 ...

  9. poj3067 二维偏序树状数组

    题解是直接对一维升序排列,然后计算有树状数组中比二维小的点即可 但是对二维降序排列为什么不信呢?? /* */ #include<iostream> #include<cstring ...

  10. hdu1081 DP类最大子段和(二维压缩+前缀和数组/树状数组计数)

    题意:给出一个 n * n 的数字矩阵,问最大子矩阵和是多少. 由于和最长子段和问题类似,一开始想到的就是 DP ,一开始我准备用两个循环进行 DP ,对于每一个 (i,j) ,考察(i - 1,j) ...

随机推荐

  1. JavaWeb学习(三) : 如何在 Eclipse 中创建一个Web 项目并成功运行?

    前置条件 : 1.确保已安装 Eclipse.Tomcat 服务器安装包 2.jdk.环境变量都已配置成功. 3.注意在安装 Eclipse 时一定要选择第二个有 Web 项目的进行安装, 不然安装成 ...

  2. C# Timer 控件的用法

    一.主要的属性 在 Windows 窗体应用程序中,定时器控件(Timer)与其他的控件略有不同,它并不直接显示在窗体上,而是与其他控件连用. Enabled 属性: 用于设置该Timer控件是否可用 ...

  3. Win10下Pytorch和配置和安装

    Pytorch的安装 注意:Pytorch的版本,cuda版本,cudnn版本,Python版本,nvidia驱动版本要相互对应,否则就会出现各种报错和问题,无法使用GPU加速计算! 查看nvida驱 ...

  4. pandas包学习笔记

    目录 zip Importing & exporting data Plotting with pandas Visual exploratory data analysis 折线图 散点图 ...

  5. 1.spring源码-BeanPostProcessor后置处理器

    1.BeanPostProcessor接口的介绍: BeanPostProcessor是一个接口,其中有两个方法,postProcessBeforeInitialization和postProcess ...

  6. x = cos x 的解析形式

    x = cos x 的解析形式 玩计算器的发现 大家都玩过计算器吧, 不知注意到没有. 输入任意数, 然后不断按最后总会输出. 什么, 你说明明记得是:? 哦, 因为你用了角度制. 这一系列操作等价于 ...

  7. Devexpress 18.2.7 破解

    1.破解文件下载 链接:https://pan.baidu.com/s/1DVANKYR3dBeHuc8DgPUihA 提取码:fyll 2.破解方式 解决压缩包,解压之后选中 DevExpress. ...

  8. NlogN复杂度寻找数组中两个数字和等于给定值

    算法导论:22页2.3-7 描述一个运行时间为O(nlogn)的算法,找出n个元素的S数组中是否存在两个元素相加等于给定x值 AC解: a=[1,3,6,7,9,15,29] def find2sum ...

  9. Mysql使用事务

    DECLARE t_error INTEGER DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; START TR ...

  10. numpy广播机制,取特定行、特定列的元素 的高级索引取法

    numpy广播机制,取特定行.特定列的元素 的高级索引取法 enter description here enter description here