网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

小悠:闲聊C/C++指针的一些知识点《一》

本文出自悠然品鉴小悠原创,转载请注明出处:http://www.youranshare.com/blog/sid/93.html

目录

闲聊C/C++指针的一些知识点《一》

闲聊C/C++指针的一些知识点《二》


在C/C++的学习中指针这一部分被公认为是最难的要害,这里我就以我刚学习指针这个东西的角度来说一下指针的各种用法,人难免会犯错,说的不恰当的地方,欢迎大家前来拍砖,小悠定会虚心学习,争取重新做人.

我们开始今天的话题吧:

1循环渐进,先说说什么是指针?

简单的说这货也是一种数据类型吧,不过这种类型的变量里面存放的都是内存地址,它的大小就32位,它本身没神马意义,但是它指向的内存区域是有很大意义的。

例如:

                                        

    pa是一个指向 a的指针,但是pa与a的存在与否是没有半毛钱关系的,pa就是指向了变量int a的内存四个字节的最低的一个字节的地址而已,如图所示:

 

2数组的指针

数组的名称本身也是指针类型的,不过这个指针是const的,指针的地址是不能被修改的。数组的指针是很重要的,比如我们可以这样子创建数组

int (*test)[3] = new int [100][3];

你可能没见过吧= =,好了接着说吧

2.1一维数组的创建与修改数据的方法

数组可以直接被创建,可以通过下标索引进行修改或者指针来修改,如图所示:

数组也可以通过new方法动态创建,但是动态创建的数组必须要手动释放掉内存,否则会照成内存泄露的,如图:

 

2.2 多维数组的创建与修改!!!!

关于多维数组,这里就有很多的问题要说了,比如数组内存的存放顺序啊,数组的指针访问啊,用指针创建多维数组等等神马的.

2.2.1多维数组在内存中的存放

我们以数组 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.2.2多维数组的创建方法总结

这里依然是通过2维数组的方法进行说明

方法一:通过for循环创建Arr[m][n]

这种方法是先创建一个长度为10的指针数组,然后通过for循环为每一个指针new出对应的5个int,就完成了二维数组的创建,但是需要注意的是因为是通过多次for循环进行new的,所以这种二维数组的内存可不是连续的哦,在释放的时候要注意的是你需要释放后面 new的[5],还得释放之前new的[10],所以这种方法比较麻烦的说.

方法二:用一维数组来替代

所谓的用一维数组替代,其实就是利用了一维数组在内存中是连续的原理,对于一个连续内存的二维数组Arr[m][n],其通过指针访问的话Arr[i][j]这个位置就是内存中第i*n+j块儿区域,例如下面的代码:

这种方法使用起来较为方便,只是每次访问的时候需要计算出具体的位置,但是还是比较推荐这种方法的~~不容易 忘记释放内存嘛。

方法三:指定new的元素大小,一次性完成对二维数组的创建

说道这个方法,首先要学会区分下面的两种变量的声明:

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];这个形式去创建动态数组了,请看代码:

这样以来是不是简化了好多操作来着?但是要注意的是这种方法局限于数组有多少列必须是确定的才行.

今天先介绍到这里,在下一篇文章中将会谈一谈 类的 指针以及类内指针的用法~~


  • 标签:
  • 数组指针
  • C++指针
  • 指针知识点
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.