数组与指针的区别

来源:互联网 发布:union安卓图像软件 编辑:程序博客网 时间:2024/06/10 23:29

区间分配:

数组是开辟一块连续的内存空间,数组本身的标示符代表整个数组,可以用sizeof取得真实的大小;指针则是只分配一个指针大小的内存,并可把它的值指向某个有效的内存空间
[全局的和静态的]
char *p= "hello ";
一个指针,指向只读数据块(section)里的 "hello ",可被编译器放入字符串池(也就是说, 你在写一个char *q= "hello ",可能和p共享数据)
char a[]= "hello ";
一个数组,分配在可写数据块(section),不会被放到字符串池中
[局部]
char *p= "hello ";
一个指针,指向只读数据块(section)里的 "hello ",可被编译器放入字符串池(也就是说, 你在写一个char *q= "hello ",可能和p共享数据),另外,在函数中可以返回它的地址,也就是说,指针是局部变量,他指向的数据却是全局的.
char a[]= "hello ";
一个数组,分配在堆栈上,初始化由编译器进行(短的话直接用指令填充,长的就从全局字符串表拷贝),不会被放到字符串池中(但是却可能从字符串池中拷贝过来),也不应该返回
它的地址.
[代码中的字面字符串]
printf( "%s\n ", "hello ");
这两个字面常量( "%s\n "和 "hello "),都在只读数据块里
[用途]
全局指针
用于不需要修改内容,却可能会修改指针的情况(当然,不修改也没人反对)
全局数组,用于不需要修改地址,却需要修改内容的场合
既需要修改指针,有需要修改内容怎么办呢?定义一个数组,在定义一个指针指向它就可以了
函数中如果不需要修改字符串的内容,应该尽量用char*p= "xxx "这种写法.
初始化的局部字符数组影响效率,一般应该尽量避开(应该使用的情况下则不要犹豫)


数组要么在静态存储区被创建,要么在栈上被创建。数组名对应着一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。


访问效率:

遍历数组元素,使用指针比使用下标能使程序会的更快的速度。


安全性:

指针可能会重复释放,而且会产生野指针,从而导致内存的泄漏;也有可能导致堆缓冲区溢出


函数形参:

数组在作为函数传参时,数组名将蜕化为指针,二维数组的存储方式是和一维数组没什么区别,但是用二维数组做参数,要注意的是:函数中的形参其实就相当于一个声明,并不产生内存分配,形参的目的就是要让编译器知道函数参数的数据类型
指针传参传递的是一参数(这里是Int实参)的地址,这样,虽然实参和形参不一样,但是它们的地址是一样的,所以对相同地址的数的操作会影响到原来的数




0 0