本文出自悠然品鉴小悠原创,转载请注明出处:http://www.youranshare.com/blog/sid/93.html
目录
在C/C++的学习中指针这一部分被公认为是最难的要害,这里我就以我刚学习指针这个东西的角度来说一下指针的各种用法,人难免会犯错,说的不恰当的地方,欢迎大家前来拍砖,小悠定会虚心学习,争取重新做人.
我们开始今天的话题吧:
简单的说这货也是一种数据类型吧,不过这种类型的变量里面存放的都是内存地址,它的大小就32位,它本身没神马意义,但是它指向的内存区域是有很大意义的。
例如:
pa是一个指向 a的指针,但是pa与a的存在与否是没有半毛钱关系的,pa就是指向了变量int a的内存四个字节的最低的一个字节的地址而已,如图所示:
数组的名称本身也是指针类型的,不过这个指针是const的,指针的地址是不能被修改的。数组的指针是很重要的,比如我们可以这样子创建数组
int (*test)[3] = new int [100][3];
你可能没见过吧= =,好了接着说吧
数组可以直接被创建,可以通过下标索引进行修改或者指针来修改,如图所示:
数组也可以通过new方法动态创建,但是动态创建的数组必须要手动释放掉内存,否则会照成内存泄露的,如图:
关于多维数组,这里就有很多的问题要说了,比如数组内存的存放顺序啊,数组的指针访问啊,用指针创建多维数组等等神马的.
我们以数组 Arr[3][2]来说明多维数组的存放,Arr[3][2]是一个3行 2列的数组,Arr[3][2]这个数组在内存中是一个连续的3x2x4字节(int是4字节的)的内存区域块儿,你可以认为这个数组在内存中是以[2]个int为一个大的块儿,然后一共有3个这样的大块儿~~,如图所示:
所以Arr[3][2]的存放是以行序优先的,也就是先存放第0行的 Arr[0][0]、Arr[0][1]
然后是第1行的Arr[1][0]、Arr[1][1]
最后是第2行的Arr[2][0]、Arr[2][1]
内存中就是图示那样的:
看下面的代码片段,数组的遍历结果和通过指针内存索引的结果是一致的,也就验证了上面的说法
如果数组是例如 MArr[3][2][3]这种呢?对于这种我们只需要对其划分,将Marr看为 3行,每行有一个二维的[2][3],就好了,在对[2][3]也可以看成上面的二维数组了~~
这里依然是通过2维数组的方法进行说明
这种方法是先创建一个长度为10的指针数组,然后通过for循环为每一个指针new出对应的5个int,就完成了二维数组的创建,但是需要注意的是因为是通过多次for循环进行new的,所以这种二维数组的内存可不是连续的哦,在释放的时候要注意的是你需要释放后面 new的[5],还得释放之前new的[10],所以这种方法比较麻烦的说.
所谓的用一维数组替代,其实就是利用了一维数组在内存中是连续的原理,对于一个连续内存的二维数组Arr[m][n],其通过指针访问的话Arr[i][j]这个位置就是内存中第i*n+j块儿区域,例如下面的代码:
这种方法使用起来较为方便,只是每次访问的时候需要计算出具体的位置,但是还是比较推荐这种方法的~~不容易 忘记释放内存嘛。
说道这个方法,首先要学会区分下面的两种变量的声明:
int (*pA)[10]; int* pB[10];
这两个看起来好像是一样的是吧?OK,让我们用cout输出两个指针的大小看看吧:
诶?感觉好像哪里不对是吧,都是指针数组,结果都不应该是40么?
其实我们可以这样看待变量的声明,例如:
int c;// int c int d[10];// int[10] d int e[10][10];// int[10][10] e
对于图种的那两个就可以这么理解了,因为pA被括号括了起来,将会被看做一个整体,
所以int (*pA)[10];就是 int[10] (*pA),
int* pB[10];就是 int*[10] pB,
这样一来就很明了了,pA是一个指向 int[10]类型(元素大小为10个int的类型)的【指针】
pB就是一个int*[10]类型的指针数组了,所以他们俩的大小是不一样的,前者为指针,后者是数组.
既然已经知道了上面的两种声明是不一样的,那么下面就用一个实例来说说int (*pA)[10];这种数组的创建方法吧。
问题:已知一个班级有m个人,大家都学习语文、数学、英语这3个科目,请用二维数组录入这些人的成绩,并打印;
分析:在这个问题中,人数m是不确定的,但是科目数3是确定的,这时候我们可以创建动态数组Arr[m][3]来完成上面的任务,因为可以确定3这个数组的列数,这个时候就能使用int (*pA)[3];这个形式去创建动态数组了,请看代码:
这样以来是不是简化了好多操作来着?但是要注意的是这种方法局限于数组有多少列必须是确定的才行.
今天先介绍到这里,在下一篇文章中将会谈一谈 类的 指针以及类内指针的用法~~