C++中指针和数组基本等价的原因在于指针算术和C++内部处理数组的方式;将整数变量加一后,其值将增加1;将指针变量加一后,增加的量等于其指向的数据类型的字节数;

指针中存储的是地址,地址在形式上和整数相似,但是意义完全不同,整数可以加减乘除,但地址相乘等操作完全没有意义;

Eg:  int *p;

P = 0xB8000000;

上面会报类型不匹配的错误,原因在于C++不知道这是一个数字还是一个地址,所以需要先进行强制类型转换

我们常说数组名就是指针,但这么说只是为了理解,准确的说,两者还是有区别的,由于我有的地方还没有完全弄清楚,所以这里只是说说自己的看法:

数组名始终存储的是数组中第一个元素的地址,不管多少维但它的类型不是指针类型,你可以认为它就是一块内存,里面存储的是地址

(1)一维的情况:

int *a;
int b = 3;
int c[3] = {1 , 2 , 3}; a = &b;
a = c;

上面这么写都是没有问题的,都是给a传入地址;但对于二维的情况就要注意了:

(2)二维的情况(二维数组在内存中也是按照一维的形式进行存储,存储结构为顺序存储):

第一种写法:

int a[2][3] = {1 , 2 , 3 , 4 , 5 , 6};
int **p;
p = a; 

上面这种写法就是错误的,错误原因是我们这里想当然的认为二维数组名a就是二级指针类型,然而这么做要么会报”非法内存的错误“,要么会报”类型不匹配“的错误,我们来分析一下:

a中存的地址是a[0][0]元素的地址,而p是一个二级指针,现在将a中存放的地址值赋给p,则p指向a[0][0]元素(即1),则*p的值就是1。则**P的值就是”地址为1“的那块内存中存放的值;这么做就会出现两种错误:

(1)如果这个地址1是计算机内部分配给系统使用的,用户没有权限,则会报”非法内存“的错误;

(2)如果这块内存用户可以使用,但是注意我在上面的”地址为1“这里打了双引号,就是说明这个”1“是int类型(或者是数组元素类型),我们之前也提过地址和整数类型只是形式相似然而意义完全不同,所以这里C++认为这个”1“是intl欸型而不是地址类型,所以就会报”类型不匹配“的错误;

综上:二维情况下,我们不能认为数组名就是二级指针;

后来,在网上看到一种说法,就是二维数组名的类型可以认为其实就是数组指针类型,操作时也没有问题,我觉得可以这么做,也可以推广到多维数组的情况:

int a[2][3] = {1 , 2 , 3 , 4 , 5 , 6};
int (*p)[3] = a;

上面这么做就没有问题,这里,p是一个数组指针类型,它指向的是一个数组,数组类型为Int,数组个数为3,起始就是二维数组第二维的元素个数(对于p,初始化的时候第一维要省略);

*(*(p + 1) + 2)的值就是a[1][2]的值,其他类似;

(3)上面可以用p这个一级指针来指向new创建的二维数组,实际操作时我们也可以使用一个二级指针来指向这个二维数组(更加实用),如下:

void test_pointer(int rows , int cols)
{
int **p = new int *[rows];
for(int i = ; i < rows ; i ++)
{
p[i] = new int[cols];
}
//这样就使用一个二级指针p指向这个二维数组,下面一般要进行一下初始化
//初始化之后,我们可以使用类似p[i][j]的形式指向二维数组中的元素了。
}

对于多维的情况应该也是类似,等以后如果遇到了不同点我再补充~

补充:(1)前面我们说过数组名的类型其实不能算是指针类型,但是在VS环境中,由于工程实现的需要:对于一维数组,可以直接用int *来代替(其实就是把它当成了指针类型);对于二维数组,VS将数组名当成了数组指针类型,当我们进行传递时,我们不能直接用int *进行传递,那样会报类型不匹配的错误,需要我们提前使用(int *)进行强制转换再进行传递;

关于C++中的指针、数组的更多相关文章

  1. C语言中的指针数组

    C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...

  2. 《挑战30天C++入门极限》C/C++中字符指针数组及指向指针的指针的含义

        C/C++中字符指针数组及指向指针的指针的含义 就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针. 先看下面的代码,注意看 ...

  3. C/C++中的指针数组和数组指针

    1. 指针数组 定义:int *p[n],由于[]的优先级高于*,p和[]结合成一个数组,该数组的元素存储的是int类型的指针,由于数组内容是指针,因此p+1的步长是sizeof(int*),在32位 ...

  4. C语言中的指针数组和数组指针

    代码: #include <iostream> using namespace std; int main(){ ]; ]; cout<<sizeof(a)<<en ...

  5. [C++学习历程]基础部分 C++中的指针数组和结构

    作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/19938177 一.指针 对学习C++来说,指针是一项重要内容,以前,教 ...

  6. ENUMSTXT.H中的指针数组

    /************************************************************************                            ...

  7. C++中,指针数组和数组指针

    这俩兄弟长得实在太像,以至于经常让人混淆.然而细心领会和甄别就会发现它们大有不同. 前者是指针数组,后者是指向数组的指针.更详细地说. 前: 指针数组;是一个元素全为指针的数组. 后: 数组指针;可以 ...

  8. C语言->实验室->指针数组

    一 分析 讨论指针数组要从三个层面来考虑: 1)指针数组本身是什么 2)指针数组作为参数时的表现 3)指针数组作为返回值时的表现 二 指针数组是什么 1)指针数组--指针的集合 数组是若干元素的集合, ...

  9. C#委托与C语言函数指针及函数指针数组

    C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

  10. 二维数组(解引用、指针数组、数组的指针)——C语言

    二维数组 在说二维数组前先来说下一维数组中的指针数组和和数组的指针 一.一维数组中指针数组和数组指针的区别 指针数组: ]; []的优先级比*高,首先它是一个数组,它的大小是5,它里面存放的数据类型是 ...

随机推荐

  1. 洛谷 P4345 [SHOI2015]超能粒子炮·改 解题报告

    P4345 [SHOI2015]超能粒子炮·改 题意 求\(\sum_{i=0}^k\binom{n}{i}\),\(T\)组数据 范围 \(T\le 10^5,n,j\le 10^{18}\) 设\ ...

  2. 【POJ3585】Accumulation Degree 二次扫描与换根法

    简单来说,这是一道树形结构上的最大流问题. 朴素的解法是可以以每个节点为源点,单独进行一次dp,时间复杂度是\(O(n^2)\) 但是在朴素求解的过程中,相当于每次都求解了一次整棵树的信息,会做了不少 ...

  3. 淘宝助理导出的csv文件使用的是什么编码,您猜?

    今天下午用Java读取从淘宝助理 V4.3 Beta1导出的csv文件,出现中文乱码情况. 一看就是文件编码引起的,不清楚淘宝助理导出的csv文件使用了什么编码,到百度搜索了一下,看到一些相关文章,但 ...

  4. re正则模块(二十五)

    一:什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中,并通过 r ...

  5. 蛋白质结构模型和功能预测:I-TASSER工具的使用

    I-TASSER是一款用于预测蛋白质结构和功能的工具,网站链接:https://zhanglab.ccmb.med.umich.edu/I-TASSER/ 具体描述如下: I-TASSER (Iter ...

  6. c# Bitmap byte[] Stream 文件相互转换

    //byte[] 转图片 publicstatic Bitmap BytesToBitmap(byte[] Bytes) { MemoryStream stream = null; try { str ...

  7. (大数)Computer Transformation hdu1041

    Computer Transformation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/ ...

  8. 基于 Django 2.0.4 的 djcelery 配置

    Django Celery 配置实践 所需环境 python 3.5.2 rabbitmq 安装所需的包 pip install -r requirements.txt QuickStart 创建Dj ...

  9. request请求地址

    1.String contextPath = httpServletRequest.getServletContext().getContextPath(); /项目名称 2.String conte ...

  10. 跨平台设置NODE_ENV(兼容win和linux)

    通过NODE_ENV可以来设置环境变量(默认值为development).一般我们通过检查这个值来分别对开发环境和生产环境下做不同的处理.可以在命令行中通过下面的方式设置这个值: linux & ...