多维静态、动态数组存贮与访问的讨论

原创 2004年07月02日 02:06:00

多维静态、动态数组存贮与访问的讨论<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

一、             先看以下的一段多维静态数组分配的一段代码

 

#include <iostream>

using namespace std;

int main(int argc, char* argv[])

{

     char sz_temp[3][3];//分配静态二维数组

     char  (*sz)[3]=NULL;//指针初始化

     sz=(char(*)[3])sz_temp;//声明一个指向一维数组的指针,主要用于访问二维数组中的行

     strcpy(*(sz+1),"abc");//进行复制数据

      return 0;

}

 

讨论:

对于以上的一段代码有人会说,这么简单,老谭的书里就是这么介绍的,嘿嘿~,确实比较简单,这里只是一个比较的前提。

       下面,再来看一张它的地址分布图:

 123.jpg

 

 456.jpg

我们可以看到,它既可用按维数进行规则的访问(例:sz[2][2]sz[1][3]);但我们也可以用sz[0][1]sz[0][3]sz[0][5]….一直到sz[0][9],在地址里面我们可以看到它们的存贮过程都是连续的即:按元素的存在顺序进行存放。从0~9进行连续空间分配。

 

二、             现在我们来看一看关于多维动态数组分配的一段代码

 

#include <iostream>

using namespace std;

int main(int argc, char* argv[])

{

     int count=5;

     char ** sz_temp=(char**)malloc((count)*sizeof(char*));

     char  (*sz)[20]=NULL;

     for(int idx=0;idx<count;idx++)

     {

       sz_temp[idx]=(char*)malloc(20*sizeof(char));

     }

     sz=(char(*)[20])sz_temp;//sz_temp转换成指向有二十个char元素 数组的指针。

strcpy(*(sz+1),"abc"); //ERROR,您可以自己想想为什么出错的?

free(sz);

     return 0;

}

      

讨论:

       先看下列地址图:


 

11.jpg

(该图其实已说明了一切)

       sz它现在被转换了,它虽然开始的地址还是以sz_temp的地址开始,但sz已把这个动态分配的数组看成了一个存放char的数组,即在sz眼中,sz_temp分配的空间是占满了char元素的空间,而且它移动的大小为20char的地址(因为类型是(char(*)[20])),再次说明,通过sz访问sz_temp再也不会表现出指针的特性,它里面只是char型数据(char取代了指针的存贮),再因为 1 char 1 bytes,  1 指针的大小是 4 bytes,因此:

 

10.jpg 

 

       sz + 1  => sz_temp + 5 // 20 * 1 5 * 4 因此,可以看到 sz + 1 的地址与sz_temp + 5 地址是同一个地址,strcpy(*(sz+1),"abc");它将sz + 1 后的地址写入了abc,可以看得出,&sz[0][4]对应sz_temp+1,也是同相同的地址。

       可能有些人会问:静态分配与动态分配中都用到了 sz=(char(*)[20])sz_temp;为什么意义会不同?

       原因如下:

1.  对于静态数组中的sz=(char(*)[20])sz_temp; sz_temp本身默认就是指向二维数组的第一行,就跟一维数组一样,指向第一个元素是一回事,如果我们把第一个例子里的sz=(char(*)[20])sz_temp; 换成 sz=sz_temp; 那么它也是正确的,sz_temp的格式本身就是(char(*)[20])型,根本就没有必要去转换。

2.  对于动态数组中的sz=(char(*)[20])sz_temp; 因为sz_temp并不是一个二维数组的数组名,它是一个指针,因此并没有第1条里说的那种特性,可以代表二维数组中的行,因此,进行转换的时候,sz会把(char(*)[20])sz_temp; 所指的动态数组看成一个二维数组中的行,当sz对动态数组进行访问时,把sz_temp分配这个动态数组里的元素全都看成了char 型数据,所以就出现了sz + 1 的地址与sz_temp + 5 地址是同一个地址。

3.  再说明一点,静态数组中的数组名地址是与第一行的地址和第一个元素的地址是同一个地址;指向动态数组的指针地址并不是动态数组的地址,这一点必须搞清。

 

嘿嘿,此问题的来源是CSDN上一位网友的问题,现在来看问题的解决哈~

 

#include <iostream>

using namespace std;

typedef char (*CharArrP)[20] ;

void fun( CharArrP arrayList )

{

   strcpy(*(arrayList),"abc"); //OK It is right.

}

 

int main(int argc, char* argv[])

{

   int count=5;

   char ** sz_temp=(char**)malloc((count)*sizeof(char*));

   CharArrP  sz=NULL;

   for(int idx=0;idx<count;idx++)

   {

      sz_temp[idx]=(char*)malloc(20*sizeof(char));

   }

   for( int i = 0; i < count; ++i )

   {

      sz = (CharArrP)sz_temp[i];

      fun( sz );

/*

1.              sz = (CharArrP)sz_temp[i]; 它是把sz_temp中第 I 个元素的指针值转换成 (*CharArrP)[20],从而指向一个含有20个元素的一维数组。这样一来,fun( sz );就可以进行匹配函数调用。

 

2.              由于动态分配 20 个元素为一组的 5 段内存,段内是连续的,段外是非连续的,所以不可以用 sz + N 的方式进行访问,sz_temp[idx] = (char*)malloc(20*sizeof(char)); 它的分配并不是紧跟在 &sz_temp[ idx-1 ][19] 地址后的。

*/

   } 

   free(sz);

   return 0;

}

多维静态、动态数组存贮与访问的讨论

多维静态、动态数组存贮与访问的讨论 一、             先看以下的一段多维静态数组分配的一段代码 #include using namespace std;int main(int argc...
  • oury
  • oury
  • 2005年02月06日 06:04
  • 815

静态数组与动态数组的区别

静态数组长度固定不变,  在编译时必须知道其长度,数组只在定义它的块语句内存在...
  • chm880910
  • chm880910
  • 2014年10月09日 21:04
  • 2624

C++静态数组和动态数组的区别

  静态数组的长度是固定的,不能根据应用程序的需要改变,而动态内存分配可满足此需求。 比如,你写一个数组用来存放一个班所有人的数学成绩,如果你知道这个班一共有50个人,那好办,直接 ...
  • menjiawan
  • menjiawan
  • 2015年06月29日 15:06
  • 4284

Delphi多维动态数组重定义长度

Delphi在定义多维数组时有两种方法:动态定义或静态定义 动态定义:bufanalog0:array of array of array of array of byte; 在使用前重设长度:  i...
  • c_huabo
  • c_huabo
  • 2010年07月15日 15:34
  • 3807

C/C++静态数组与动态数组的区别

简介以下三行代码有什么区别?int a[10]; int *a = (int*)malloc(sizeof(int)*10); int *a = new int[10]; 第一行代码定义a为包含10个...
  • bendanban
  • bendanban
  • 2016年04月25日 19:11
  • 2895

动态数组和静态数组

动态数组和静态数组,可能在使用的时候看上去挺相似,实质却不一样。 现在我们就谈谈他们的区别 #include #include void fun( int *p ) { sizeof(...
  • wjhyxr
  • wjhyxr
  • 2016年05月11日 14:49
  • 223

二.一维和多维,静态与动态数组

1.数组概论 数组是一种按顺序存储的数据结构,可以使用下标进行随机化访问。 2.静态数组2.1 一维数组 使用顺序存储,可以随时改变其中内容。 申请方式: 语言 申请方式 java 数组类...
  • u013254061
  • u013254061
  • 2016年09月12日 16:11
  • 150

Ojbect Pascal动态数组浅说

初用Delphi中的动态数组时,有些迷惑.1、动态数组是指针吗?动态数组通常会表现出指针功能,先看下面的例子:procedure DymArrTest();var  A, B: array of In...
  • Tercel99
  • Tercel99
  • 2008年02月13日 09:29
  • 1033

多维动态数组

《C++  Primer》中说:在C++中没有多维数组,只有元素师数组的数组。 如:要想创建一个二维整数数组,首先要创建一个一维动态数组,它由int *类型的指针构成。int*就是这个一维int指针...
  • yaoxinchao
  • yaoxinchao
  • 2012年10月26日 16:02
  • 497

delphi 动态数组和静态数组首地址的区别

动态数组开始地址和静态数组的开始地址是不同的,注意下面代码中的File.Read函数的第一个参数动态数组使用var Source : array of byte;  File : TFileStrea...
  • webouse
  • webouse
  • 2008年10月16日 11:01
  • 2800
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多维静态、动态数组存贮与访问的讨论
举报原因:
原因补充:

(最多只允许输入30个字)