`

关于数组指针和指针数组

阅读更多

在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和该方法都在堆空间,示例图如下:
该方法的缺点是我们要根据行列动态地计算元素在数组中的偏移量,则需要一定的开销。
但可以同时 兼有方法1,2占用内存较少,以及方法3,4不需要实现知道行列数 的优点。
 

 

 

总结:

  • 以上四种方式分别针对行列数已知、行数未知列数已知、行数已知列数未知、行列数都未知的情况使用。其中方式1,2使用的内存空间大小相同,方式3,4使用的内存空间大小相同。
  • 方式3,4比方式1,2 多用r个指针空间,r为行数。
  • 方式2比方式3在只知道一维维数的情况下要更优,只需要做数据转置存储即可。
  • 当行列数都需要在运行时才能知道的情况只能使用方式4.
  • 方式5需要动态计算元素的偏移量,但艰巨了方法1,2和方法3,4 的优点。

 

 

 

 

 
  • 大小: 20.9 KB
  • 大小: 22.4 KB
  • 大小: 29 KB
  • 大小: 29.5 KB
  • 大小: 24 KB
分享到:
评论
2 楼 liuzhiqiangruc 2015-12-10  
zhoumengkang 写道
  说得好!正好在 hashtable 那边存 bucket 用到了

1 楼 zhoumengkang 2015-06-25  
  说得好!正好在 hashtable 那边存 bucket 用到了

相关推荐

    关于数组指针和指向数组指针的指针及其new

    关于数组指针和指向数组指针的指针及其new的一些个人理解及其小例子,详细可以参见我的CSDN博客中的文章http://blog.csdn.net/shizhixin/article/details/7050592

    数组指针和指针数组的区别

    数组指针和指针数组的区别 在 C 语言中,数组指针和指针数组是两个容易混淆的概念,但它们之间有着巨大的区别。本文将详细讲解数组指针和指针数组的定义、内存布局、区别,并通过实例代码加深读者的理解。 一、...

    彻底理解指针,指针数组和数组指针,指针函数和函数指针

    ### 彻底理解指针,指针数组和数组指针,指针函数和函数指针 #### 一、基础知识 在计算机编程中,指针是一个非常重要的概念,尤其是在C/C++这样的语言中更是如此。简单来说,指针是一种变量,但它存储的不是普通的...

    数组与指针区别(很全面)

    本文旨在澄清关于数组名是否等同于指针这一常见的误区,并通过具体的代码示例来深入探讨数组和指针之间的关系及其差异。 #### 二、数组与指针的基本概念 1. **数组**: - 数组是一系列相同类型的数据项的集合。 ...

    数组指针和指针数组

    数组指针和指针数组是C语言中关于指针和数组概念的重要知识点,它们虽然听起来相似,但其实是完全不同的两个概念,涉及到内存布局、指针的优先级问题、数组指针的定义、以及指针与整数运算的规则等方面。 首先,...

    数组的指针和指向数组的指针变量

    数组的指针和指向数组的指针变量 数组的指针和指向数组的指针变量是编程语言中一个重要的概念。数组的指针是指向数组在内存中的起始地址,而指向数组的指针变量是指向数组元素的指针变量。 概念: * 数组的指针:...

    指针数组与数组指针与二级指针

    通过理解指针数组、数组指针和二级指针,我们可以更灵活地操控内存,提高代码的效率和灵活性。这些概念对于理解C语言的底层机制和编写高效程序至关重要。在实际编程中,要特别注意指针的生命周期管理,避免内存泄漏...

    数组指针和指针数组示例

    数组指针和指针数组

    指针数组与数组指针

    ### 指针数组与数组指针的概念及区别 在计算机编程中,特别是C语言及其衍生语言中,指针是一个非常重要的概念。它允许程序员直接访问内存地址,并对其进行操作。当我们深入探讨指针时,会遇到两个看似相似但实际上...

    指针数组与数组指针总结更新

    指针数组与数组指针是两种不同的数据结构概念,...通过深入理解和掌握指针数组与数组指针,我们可以在C语言编程中更高效地处理数据,实现复杂的数据结构操作。同时,也能够更安全地使用指针,避免内存泄漏等常见错误。

    数组指针和指针数组.md

    数组指针和指针数组

    C的指针数组和数组指针

    在学习“指针数组”和“数组指针”的概念之前,我们首先需要理解什么是“指针”。指针是一种数据类型,用于存储内存地址。在C语言中,指针变量的类型决定了它可以指向的数据类型。 - **指针的类型**:`char*`, `int...

    C51单片机C语言编程数组指针和指针数组应用.doc

    C51单片机C语言编程数组指针和指针数组应用 本文档介绍了C51单片机C语言编程中的数组指针和指针数组应用。在指针变量中存放一个数组或一个函数的首地址可以使程序的概念十分清楚,程序本身也精练,高效。 数组指针...

    C语言中数组指针在汇编语言寻址方式中的应用.pdf

    该文档可以作为C语言和汇编语言的学习资源,帮助学生和开发者更好地理解C语言中数组指针的概念和应用。 C语言中数组指针在汇编语言寻址方式中的应用非常广泛。数组指针的使用可以使得程序更加高效和灵活,提高程序...

    数组和指针练习题目(精选)

    数组和指针练习题目(精选) 在编程语言中,数组和指针是非常重要的概念,它们的应用非常广泛,理解基础是非常必要的。本节将通过多种练习题目来加深对数组和指针的理解。 指针基础 指针是一种特殊的变量,它可以...

    C语言数组指针(指向数组的指针)_C语言中文网1

    在C语言中,数组是一种非常重要的数据结构,它允许存储一系列具有相同类型的元素。...在深入学习C语言指针时,还会涉及到二级指针、指针数组、字符串指针、函数指针等各种复杂情况,这些都需要逐步学习和实践。

    彻底了解指针数组,数组指针以及函数指针

    ### 彻底了解指针数组、数组指针以及函数指针 #### 一、指针与内存分配...通过上述介绍,我们可以看到指针数组、数组指针以及函数指针在C语言中的重要性和灵活性。熟练掌握这些概念对于编写高效、灵活的代码至关重要。

    C++数组指针题含答案.doc

    本文档主要讲解了 C++ 编程语言中数组指针的四个实践题目,每个题目都包含了详细的代码实现和输出结果。下面是对每个题目的详细解释: 数组指针 01:逆序输出从键盘输入 n 个整数(n),存放在一个一维数组中,逆序...

Global site tag (gtag.js) - Google Analytics