1.传统数组的缺点:
①数组长度必须事先制定,且只能是常整数,不能是变量
例如:
int a [ 5 ] ; // ok
int len = 5 ;int a [ len ] ; //error
②传统形式定义的数组,该数组的内存程序员无法手动释放,
在一个函数运行期间,系统为该函数中数组所分配的空间会
一直存在,直到该函数运行完毕时,数组的空间才会被系统
释放。
③数组的长度一旦定义,其长度就不能更改。
数组的长度不能在函数运行的过程中动态的扩充或缩小
④A函数定义的数组,在A函数运行期间可以被其它函数使用,
但A函数运行完毕之后,A函数中的数组无法被其他函数使用。
传统方式定义的数组不能跨函数使用。
2.为什么需要动态分配内存:
动态数组解决了传统数组的这四个缺陷。
传统数组也叫静态数组
3.动态内存分配举例,动态数组的构造:
malloce函数的用法;
malloc 是 memory ( 内存 ) 和 allocate ( 分配 ) 的缩写
例如:
#include < stdio.h >
#malloce < stdio.h >
int main (void)
{
int i = 5 ; // 分配了四个字节,静态分配,11行
int * p = ( int * ) malloce ( 4 ) ; // 12行
/ *
1.要使用malloce函数,必须添加malloce这个头文件
2.malloce函数只有一个形参,并且形参是整型
3.4表示请求系统为本程序分配四个字节
4.mallce只能返回第一个字节的地址
5.12行分配了8个字节,p变量占4个字节,p所指向的内存占4个字节
6.p本身所占的内存是静态分配的,p所指向的内存是动态分配的
* /
* p = 5 ; // * p 代表的就是一个int变量,只不过 * p这个整型变量的内存分配方式和11行的 i 变
量的分配方式不同
free ( p ) ; // 表示把p指向的内存给释放掉,p本身的内存是静态的,,不能由程序员手动释放,
p本身的内存只能在p变量所在的函数运行终止时由系统自动释放
printf (" 同志们好!\n" );
return 0;
}
5.动态内存和静态内存呢的比较:
静态内存是由系统自动分配,由系统自动释放,静态内存是在栈分配的。
动态内存是由程序员手动分配的,手动释放,动态内存是堆分配的。
6.多级指针:
#include < stdio.h >
int main ( void )
{
int i = 10 ;
int * p = & i ;
int ** q = & p ;
int *** r = & q ;
// r = & p ; //error,因为r是int ***类型,r只能存放int ** 类型变量的地址
printf ( “ i = %d\n ” , ***r );
return 0 ;
}