动态数组.docx

上传人:b****2 文档编号:17831177 上传时间:2023-08-04 格式:DOCX 页数:20 大小:20.39KB
下载 相关 举报
动态数组.docx_第1页
第1页 / 共20页
动态数组.docx_第2页
第2页 / 共20页
动态数组.docx_第3页
第3页 / 共20页
动态数组.docx_第4页
第4页 / 共20页
动态数组.docx_第5页
第5页 / 共20页
动态数组.docx_第6页
第6页 / 共20页
动态数组.docx_第7页
第7页 / 共20页
动态数组.docx_第8页
第8页 / 共20页
动态数组.docx_第9页
第9页 / 共20页
动态数组.docx_第10页
第10页 / 共20页
动态数组.docx_第11页
第11页 / 共20页
动态数组.docx_第12页
第12页 / 共20页
动态数组.docx_第13页
第13页 / 共20页
动态数组.docx_第14页
第14页 / 共20页
动态数组.docx_第15页
第15页 / 共20页
动态数组.docx_第16页
第16页 / 共20页
动态数组.docx_第17页
第17页 / 共20页
动态数组.docx_第18页
第18页 / 共20页
动态数组.docx_第19页
第19页 / 共20页
动态数组.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

动态数组.docx

《动态数组.docx》由会员分享,可在线阅读,更多相关《动态数组.docx(20页珍藏版)》请在冰点文库上搜索。

动态数组.docx

动态数组

C语言动态数组

百科名片

动态数组是指在声明时没有确定数组大小的数组,即忽略圆括号中的下标;当要用它时,可随时用ReDim语句(C语言中用malloc语句)重新指出数组的大小。

使用动态数组的优点是可以根据用户需要,有效利用存储空间。

目录

关于动态数组什么是动态数组?

1.为什么要使用动态数组?

2.动态数组与静态数组的对比

3.遵循原则

4.构建所需指针

5.构建所需函数

6.说明:

7.具体构建方法

看代码前必看

1~4维数组的动态构建实例

1.一维

2.二维

3.三维

4.四维

动态扩充数组案例

消字母游戏精简版中的应用

1.预备知识

2.代码

关于动态数组什么是动态数组?

1.为什么要使用动态数组?

2.动态数组与静态数组的对比

3.遵循原则

4.构建所需指针

5.构建所需函数

6.说明:

7.具体构建方法

看代码前必看

1~4维数组的动态构建实例

1.一维

2.二维

3.三维

4.四维

动态扩充数组案例

消字母游戏精简版中的应用

1.预备知识

2.代码

展开

关于动态数组什么是动态数组?

  动态数组是相对于静态数组而言。

静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。

而动态数组则不然,它可以随程序需要而重新指定大小。

动态数组的内存空间是从堆(heap)上分配(即动态分配)的。

是通过执行代码而为其分配存储空间。

当程序执行到

这些语句时,才为其分配。

程序员自己负责释放内存。

(欲详细了解堆请见堆栈)

为什么要使用动态数组?

  在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预

  先确定。

对于这种问题,用静态数组的办法很难解决。

为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。

动态数组与静态数组的对比

  对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!

  对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。

但其使用非常灵活,能根据程序需要动态分配大小。

  如何构建动态数组

遵循原则

  申请的时候从外层往里层,逐层申请;

  释放的时候从里层往外层,逐层释放。

构建所需指针

  对于构建一维动态数组,需要一维指针;

  对于二维,则需要一维,二维指针;

  三维需要一,二,三维指针;

  依此类推。

构建所需函数

  

函数原型

返回

功能说明

void*malloc(unsignedintsize);

成功:

返回所开辟

  空间首地址失败:

返回空指针

向系统申请

size字节的堆空间

void*calloc(unsignedintnum,unsignedintsize);

成功:

返回所开辟空间首地址失败:

返回空指针

按类型申请

num个size字节的堆空间

voidfree(void*p);

无返回值

释放p指向的堆空间

void*realloc(void*p,unsignedintsize);

成功:

返回新开辟空间首地址失败:

返回空指针

将p指向的堆空间变为size

说明:

(1)规定为void*类型,这并不是说该函数调用后无返回值,而是返回一个结点的地址,该地址的类型为void(无类型或类型不确定),即一段存储区的首址,其具体类型无法确定,只有使用时根据各个域值数据再确定。

可以用强制转换的方法将其转换为别的类型。

例如:

double*pd=NULL;pd=(double*)calloc(10,sizeof(double));

表示将向系统申请10个连续的double类型的存储空间,并用指针pd指向这个连续的空间的首地址。

并且用(double)对calloc()的返回类型进行转换,以便把double类型数据的地址赋值给指针pd。

  

(2)使用sizeof的目的是用来计算一种类型的占有的字节数,以便适合不同的编译器。

  (3)由于动态分配不一定成功,为此要附加一段异常处理程序,不致程序运行停止,使用户不知所措。

通常采用这样的异常处理程序段:

  if(p==NULL)/*或者if(!

p)*/{printf("动态申请内存失败!

\n");exit

(1);//异

  常退出}

  (4)这四个函数头文件均包含在中。

  (5)分配的堆空间是没有名字的只能通过返回的指针找到它。

  (6)绝不能对非动态分配存储块使用free。

也不能对同一块内存区同时用free释放两次。

  如:

free(p);free(p);

  (7)调用free()时,传入指针指向的内存被释放,但调用函数的指针值可能保持不变,因为p是作为形参而传递给了函数。

严格的讲,被释放的指针值是无效的,因为它已不再指向所申请的内存区。

这时对它的任何使用便可能会可带来问题。

  malloc与calloc的区别

  对于用malloc分配的内存区间,如果原来没有被使用过,则其中的每一位可能都是0;反之,如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。

也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常运行,但经过一段时间后(内存空间已被重新分配)可能会出现问题,因此在使用它之前必须先进行初始化(可用memset函数对其初始化为0),但调用calloc()函数分配到的空间在分配时就已经被初始化为0了。

当你在calloc()函数和malloc()函数之间作选择时,你需考虑是否要初始化所分配的内存空间,从而来选择相应的函数。

具体构建方法

  以三维整型数组array[n1][n2][n3]为例。

  先遵循从外层到里层,逐层申请的原则:

  最外层指针是array,它是个三维指针,所指向的是array[],其为二维指针。

所以给array申请内存应:

  array=(int***)calloc(n1,sizeof(int**));

  次层指针是array[],它是个二维指针,所指向的是array[][],其为一维指针。

所以给array[]

  申请内存应:

  for(i=0;i

  {

  array[i]=(int**)calloc(n2,sizeof(int*));

  }

  最内层指针是array[][],它是个一维指针,所指向的是array[][][],其是个整型常量。

所以给array[][]申请内存应:

  for(i=0;i

  {

  for(j=0;j

  {

  array[i][j]=(int*)calloc(n3,sizeof(int));

  }

  }

  当然,你可以把它们整合在一起为:

  inti,j,k;

  intn1,n2,n3;

  int***array;

  scanf("%d%d%d",&n1,&n2,&n3);

  array=(int***)calloc(n1,sizeof(int**));

  for(i=0;i

  {

  array[i]=(int**)calloc(n2,sizeof(int*));

  for(j=0;j

  {

  array[i][j]=(int*)calloc(n3,sizeof(int));

  for(k=0;k

  {

  array[i][j][k]=i+j+k+1;

  }

  }

  }

  最后不要忘了释放这些内存,这要遵循释放的时候从里层往外层,逐层释放的原则。

  分析过程可参考上面的解答,这里不再赘述。

只给出代码吧:

  for(i=0;i

  {

  for(j=0;j

  {

  free(array[i][j]);//释放第三维指针

  }

  }

  for(i=0;i

  {

  free(array[i]);//释放第二维指针

  }

  free(array);//释放第一维指针

  其余维的如四维创建过程大同小异,这里不再赘述。

看代码前必看

  由于百科里贴的代码每行前都会有许多中文空格,造成直接复制粘贴到编译器上编译时会出现许多错误。

(除非自己手工把代码前的空格全删掉)所以我特地把代码贴到了扩展资料那,要的话去那拿吧。

1~4维数组的动态构建实例

一维

  #include

  #include

  intmain()

  {

  intn1,i;

  int*array;

  puts("输入一维长度:

");

  scanf("%d",&n1);

  array=(int*)malloc(n1*sizeof(int));//第一维

  for(i=0;i

  {

  array[i]=i+1;

  printf("%d\t",array[i]);

  }

  free(array);//释放第一维指针

  return0;

  }

二维

  #include

  #include

  intmain()

  {

  intn1,n2;

  int**array,i,j;

  puts("输入一维长度:

");

  scanf("%d",&n1);

  puts("输入二维长度:

");

  scanf("%d",&n2);

  array=(int**)malloc(n1*sizeof(int*));//第一维

  for(i=0;i

  {

  array[i]=(int*)malloc(n2*sizeof(int));//第二维

  for(j=0;j

  {

  array[i][j]=i+j+1;

  printf("%d\t",array[i][j]);

  }

  puts("");

  }

  for(i=0;i

  {

  free(array[i]);//释放第二维指针

  }

  free(array);//释放第一维指针

  return0;

  }

三维

  #include

  #include

  intmain()

  {

  intn1,n2,n3;

  int***array;

  inti,j,k;

  puts("输入一维长度:

");

  scanf("%d",&n1);

  puts("输入二维长度:

");

  scanf("%d",&n2);

  puts("输入三维长度:

");

  scanf("%d",&n3);

  array=(int***)malloc(n1*sizeof(int**));//第一维

  for(i=0;i

  {

  array[i]=(int**)malloc(n2*sizeof(int*));//第二维

  for(j=0;j

  {

  array[i][j]=(int*)malloc(n3*sizeof(int));//第三维

  for(k=0;k

  {

  array[i][j][k]=i+j+k+1;

  printf("%d\t",array[i][j][k]);

  }

  puts("");

  }

  puts("");

  }

  for(i=0;i

  {

  for(j=0;j

  {

  free(array[i][j]);//释放第三维指针

  }

  }

  for(i=0;i

  {

  free(array[i]);//释放第二维指针

  }

  free(array);//释放第一维指针

  return0;

  }

四维

  #include

  #include

  intmain()

  {

  intn1,n2,n3,n4;

  int****array;

  inti,j,k,m;

  puts("输入一维长度:

");

  scanf("%d",&n1);

  puts("输入二维长度:

");

  scanf("%d",&n2);

  puts("输入三维长度:

");

  scanf("%d",&n3);

  puts("输入四维长度:

");

  scanf("%d",&n4);

  array=(int****)malloc(n1*sizeof(int***));//第一维

  for(i=0;i

  {

  array[i]=(int***)malloc(n2*sizeof(int**));//第二维

  for(j=0;j

  {

  array[i][j]=(int**)malloc(n3*sizeof(int*));//第三维

  for(k=0;k

  {

  array[i][j][k]=(int*)malloc(n4*sizeof(int));//第四维

  for(m=0;m

  {

  array[i][j][k][m]=i+j+k+m+1;

  printf("%d\t",array[i][j][k][m]);

  }

  puts("");

  }

  puts("");

  }

  puts("");

  }

  for(i=0;i

  {

  for(j=0;j

  {

  for(k=0;k

  free(array[i][j][k]);//释放第四维指针

  }

  }

  for(i=0;i

  {

  for(j=0;j

  {

  free(array[i][j]);//释放第三维指针

  }

  }

  for(i=0;i

  {

  free(array[i]);//释放第二维指针

  }

  free(array);//释放第一维指针

  return0;

  }

动态扩充数组案例

  #include

  #include

  intmain()

  {

  int*n,*p;

  inti;

  n=(int*)calloc(1,sizeof(int));

  for(i=0;i<5000;i++)

  {

  n[i]=i+1;

  printf("%d\t",n[i]);

  p=(int*)realloc(n,(i+2)*sizeof(int));//动态扩充数组

  if(p!

=NULL)

  n=p;

  else

  {

  puts("error!

");

  return0;

  }

  }

  free(n);

  return0;

  }

消字母游戏精简版中的应用

预备知识

  

(1)getch()

  函数原型:

intgetch(void);

  函数功能:

从控制台读取一个字符,但不显示在屏幕上。

  函数返回:

读取的字符。

  

(2)rand()

  函数原型:

intrand(void);

  函数功能:

随机函数,产生0到32767间的随机整数(0到0x7fff之间)。

  函数返回:

随机整数

  所属文件:

  (3)srand()

  函数原型:

voidsrand(unsignedseed);

  函数功能:

该函数和rand随机函数配合使用,产生随机数的起始发生数据。

  参数说明:

seed为无符号整数。

  所属文件:

  (4)time()

  函数原型:

time_ttime(time_t*timer)

  函数功能:

得到机器的日历时间或者设置日历时间。

  函数返回:

机器日历时间。

  参数说明:

timer=NULL时得到机器日历时间,timer=时间数值时,用于设置日历时间,

  time_t是一个long类型。

  所属文件:

  (5)'\b'实现退格,即当前光标后退一格。

  (6)'\a'实现响铃,即执行时计算机会嘟一声。

  (7)得到随机数值范围在a~b(包含b)的方法:

rand()%(b-a+1)+a;

代码

  #include

  #include//getch()函数所需头文件

  #include//随机函数所需头文件

  #include//time()函数所需头文件

  voidclear(void)//此函数用以清除当前行

  {

  printf("\r\r");

  }

  voidstart(void)

  {

  puts("这是消单词游戏的精简版,还不会图像编程的人可以看一看");

  puts("由于没有引人数据库,所以此单词是模拟的。

");

  puts("按任意键开始,按Esc键结束,按tab键重新开始:

");

  puts("一旦输错,将发出声音警告,你必须重新输入。

");

  puts("按任意键开始,按Esc键结束:

");

  getch();

  }

  intmain()

  {

  char*c_rand,*c_input;

  inti,j,N,n,space,N_rand;

  start();

  printf("\r你想消最多由多少个字母组成的单词?

(输入数字(1-9)");

  n=getch();

  N=n-'0';//将输入的字符转换为整型数字

  clear();//清除当前行

  if(!

((N>=1&&N<=9)||n==27))//27是键Esc的ASII值

  {

  printf("\r范围错误,请重新开始:

");

  getch();

  exit

(1);//异常退出

  }

  if(n==27)

  return0;

  srand(time(NULL));//用来对随机函数初始化

  c_rand=(char*)malloc(N+1);

  c_input=(char*)malloc(N+1);

  while

(1)

  {

  N_rand=rand()%N+1;//实现单词长度随机定义

  for(i=0;i

  {

  c_rand[i]=(rand()==0)?

(rand()&+'A'):

(rand()&+'a');//随机取个字母

  }

  c_rand[N_rand]='\0';

  //下面四行代码实现单词位置随机出现

  space=rand()P;

  putchar('\r');

  for(i=0;i

  putchar('');

  printf("%s",c_rand);

  for(i=0;i

  {

  c_input[i]=getch();//用户输入

  if(c_input[i]=='\x1b')//"\x1b"代表的是Esc键

  break;

  //下面五行代码实现字母消失效果

  putchar('\r');

  for(j=0;j

  putchar('');

  for(j=0;j<=i;j++)

  putchar('');

  if(c_input[i]!

=c_rand[i])

  {

  i=-1;

  putchar('\a');

  //下面四行代码代码字母重现效果

  putchar('\r');

  for(j=0;j

  putchar('');

  printf("%s",c_rand);

  }

  }

  if(c_input[i]=='\x1b')//"\x1b"代表的是Esc键

  break;

  }

  free(c_rand);

  free(c_input);

  return0;

  }

词条图册更多图册

扩展阅读:

∙1

动态数组在消字母游戏精简版的应用(C语言)

∙2

∙3

动态扩充数组实例(C语言)

∙4

∙5

四维动态数组构建实例(C语言)

∙6

∙7

三维动态数组构建实例(C语言)

∙8

∙9

二维动态数组构建实例(C语言)

∙10

∙11

一维动态数组构建实例(C语言)

∙12

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2