在C/C++的编程中,对指针的使用和了解,再熟悉都不为过。
C/C++毫无疑问的十分强大,但离开了指针和数组,它们就什么都干不了了,可见其重要。
使用数组和指针来描述数据,是C/C++编程中最常见的工作。
本文通过一个描述二维数据的问题,来回顾下数组和指针的使用。
假设我们要表示的是一个5行3列的数据,则共有如下五种常用方式。
每种方式各有优缺点以及适用场景。
方法1,二维数组:
int data[5][3];该方法的优点是完全不用关注内存什么时候创建和销毁的问题,直接使用即可。
但需要在程序运行之前就知道数据的行列数。
该方式的内存空间由编译器在栈空间创建。
空间示例如下图:
方法2,数组指针:
int (*data)[3]; data = (int(*)[3])malloc(sizeof(int[3]) * 5); /// some code here free(data);该方式的不便之处是需要在运行时通过malloc创建堆内存来存放二维数据,而且使用完之后需要free掉。
同时该方法可以适用于在程序运行前行数不确定的情况,即在运行时动态确定数据行数。
该方法所需创建的空间大小与方法1相同,不同在于空间是堆空间,其创建是由malloc在运行时完成的。
空间示例图如下:
方法3,指针数组:
int * data[5]; for (int i = 0; i< 5; i++){ data[i] = (int*) malloc(sizeof(int)*3); } /// some code here for (int i = 0; i< 5; i++){ free(data[i]); }
该方式与方法2的做法从逻辑上正好相反,同样适用于只知道二维数据中一维维数的情况。
但该方法与方式2相比却要多次调用malloc 和free进行内存的创建和释放,而且总使用的内存空间也更大。
其中data变量不需要free,因为其空间并不是在运行时通过malloc创建的。data自己的内存区会在程序运行出data所在的代码块之后自动销毁(栈空间)。当然data不能是static。
空间示例图如下:
方法4,指针的指针:
int ** data; data = (int **)malloc(sizeof(int*) * 5); for (int i = 0;i < 5; i++){ data[i] = (int*)malloc(sizeof(int) * 3); } /// some code here for (int i = 0;i < 5; i++){ free(data[i]); } free(data);
该方式适用于在程序运行前行列都不知道的情况下,在运行时动态创建用来存储二维数据的内存空间。
该方式最灵活。data变量自己指向的空间也是在运行时由malloc创建,需要free掉,因此与方法3相比,要多一次malloc和free操作。
但与方法3在总内存空间占用量上是一致的。
空间示例图如下:
方法5,一维数组模拟:
实际上方法1,2本质上也是一个“一维数组”,只是你需要告诉编译器row维加一的时候,步长是多少而已。
而本法发,不需要编译器计算步长,而是我们自己计算。代码如下:
int * data = NULL; data = (int *) malloc(sizeof(int)*5 *3); for (int i = 0;i < 5; i++){ for (int j = 0; j < 3j ++){ ///do something with element: data[i * 3 + j] ,这里的3就是row维加一的步长 } } free(data) data = NULL;该方法和方法2更像,因为方法1的内存空间在栈空间,方法2和该方法都在堆空间,示例图如下:
相关推荐
关于数组指针和指向数组指针的指针及其new的一些个人理解及其小例子,详细可以参见我的CSDN博客中的文章http://blog.csdn.net/shizhixin/article/details/7050592
数组指针和指针数组的区别
下面我们来仔细说明一下字符指针数组和指向指针的指针,段1中的程序是下面的样子: char *a[]={"abc","cde","fgh"}; char* *b=a; cout*b|"*(b+1)|"*(b+2); char *a[]定义了一个指针数组,注意不是char[], ...
如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,笔者就不甚欣慰了。借此文,笔者站在 无数对知识如饥似渴的中国程序员之中,深深寄希望于国内的计算机图书编写者们,能以"深入探索"的思维方式和精益求精...
彻底理解指针,指针数组和数组指针,指针函数和函数指针.doc
c语言指针数组 ... 数组指针的意思即为通过指针引⽤数组,p先和*结合,说明了p是⼀个指针变量,指向⼀个⼤⼩为5的数组。 所以,int(*p)[5即为⼀个数组指针。int *p[5]则是⼀个⼤⼩为5且存放整型指针的数组。
数组指针和指针数组
数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量
指针与二维数组 数组指针 指针数组 多级指针
数组指针和指针数组
数组指针和指针数组的区别 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二...
数组指针与指针数组 数组指针: 什么是数组指针:能够指向数组的指针。 定义一个int (*p)[10],首先()的优先级高于[]所以p首先是一个指针,指向的是一个整形的一维数组,所以是数组指针。 数组指针是一个指针不是...
指针, 指针的指针, 数组, 指针数组, 数组指针, 指针函数, 函数指针 CC++中函数指针的含义
易语言数组转指针源码,数组转指针,子程序1,子程序2,子程序3,数组_整数转指针,数组_指针转整数,数组_文本转指针,数组_指针转文本,数组_字节集转指针,数组_指针转字节集,内存_申请,内存_释放,内存_取长度,内存_写入,...
自己学习过程中记录的一些信息,可能不全C语言学习笔记变量数组指针C语言学习笔记变量数组指针C语言学习笔记变量数组指针C语言学习笔记变量数组指针C语言学习笔记变量数组指针C语言学习笔记变量数组指针
数组和指针在各类编程语言中,都很重要,数组应用很广泛,理解基础很必要
C++课程-3_数组指针与字符串 C++课程-3_数组指针与字符串
C语言的简单基本实例,包括循环、嵌套、数组、指针、函数、结构体等内容。
C++数组指针题含答案.doc