c语言==数组和指针间的联系与区别(10)
2016-07-21 14:04
411 查看
数组与指针的联系
例如,在某个函数的形参里,会有char ptr[100],这时编译器会将它默认看成是char * ptr,在函数里面可以自增,即ptr++。类似地,char src[3][100]也可以被看做是char *src[100]
//传二维数组,用一维数组指针
//若此时*(src + i),即src[i],是加的100步长
//所以中括号里的100不可以省略,不然不知道步长是多少
由此可见,char src[2][3][100],可看做是char *src[3][100]
值得注意的是,char *ptr[3],可看做是
char **ptr
//因为这传的是一个指针数组,所以要将数组里的元素即指针保存起来,一般保存的都是地址,所以要用指针,所以要用指针来保存数组里的指针,即用指针的指针来保存。
//
**ptr 有两种解释,一种就是指针变量的地址,一种就是数组指针。
//指针数组里的指针都是野指针,要利用规避野指针的方法来应对
数组与指针的区别
空间分配:数组:是一种静态分配(静态存储区或栈空间)
指针:是一种动态分配(堆空间)
访问效率
数组:直接访问值(更高)
指针:间接访问值
安全性
数组:可能会出现数组越界(更高)
指针:可能会造成内存泄漏
函数形参
数组:一维数组用指针存放,二维数组用一维指针存放
处理对象
数组:偏向于对值的处理
指针:偏向于对机器数的处理
空间连续性
数组:一定是连续的空间
指针:不一定是连续的空间
常见的内存错误及对策(在重要步骤下printf提示信息或者用gdb来找段错误)
1、内存分配未成功,却使用了他
2、内存分配虽成功,但尚未初始化就引用了他
3、内存分配成功并已初始化,但操作越过了内存的边界
4、忘记释放内存,造成内存泄漏
5、释放了内存却继续使用他
相关文章推荐
- 关于指针的一些事情
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#比较二个数组并找出相同或不同元素的方法
- C#动态调整数组大小的方法
- 详解Lua中的数组概念知识
- Perl中的列表和数组学习笔记
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- Linux Shell 数组建立及使用技巧
- PowerShell数组的一些操作技巧
- C#通过yield实现数组全排列的方法
- C#不重复输出一个数组中所有元素的方法
- C#实现将数组内元素打乱顺序的方法
- C#中用foreach语句遍历数组及将数组作为参数的用法
- C# Pointer指针应用实例简述
- 详解C#编程中一维数组与多维数组的使用
- Ruby简明教程之数组和Hash介绍