详解C语言数组中是以列优先吗
如果我们按照C语言的方式存储它,也就是行优先存储的话,那么在内存中,它的形状是这样的:
这种存储方式又被称作Ccontiguousarray。
C语言数组结构列优先顺序存储的实现(GCC编译)。
从行优先转换为列优先存储方式,与行优先相比,不同之处在于改变了数组维界基址的先后顺序,从而改变了映像函数常量基址。
/** *@briefC语言数组列优先实现 *@authorwid *@date2013-11-02 * *@note若代码存在bug或程序缺陷,请留言反馈,谢谢! */ #include#include #include #include #defineOK1 #defineERROR-1 #defineMAX_DIM8///允许的最大数组维数 typedefintElemType; typedefstruct { ElemType*base;///数组元素基址 intdim;///数组维数 int*bounds;///数组维界基址 int*constants;///数组映像函数常量基址 }Array;///数组结构 ///数组方法声明 intInitArray(Array*pArr,intnDim,...);///初始化数组pArr voidDestroyArray(Array*pArr);///销毁数组pArr intLocate(Array*pArr,intnDim,va_listap);///定位下标指向的元素在数组中的位置 intAssign(Array*pArr,ElemType*elm,...);///数组赋值 intValue(Array*pArr,ElemType*elm,...);///数组取值 ///数组方法实现 /** *@brief初始化数组 * *@parampArr指向待初始化的数组 *@paramnDim数组的维数 *@param...数组各维数的长度 * *@return初始化成功返回OK,否则返回ERROR */ intInitArray(Array*pArr,intnDim,...) { ||nDim>MAX_DIM) returnERROR; ///初始化pArr数组维数属性 pArr->dim=nDim; ///构造数组维界基址 pArr->bounds=(int*)malloc(nDim*sizeof(int)); if(!pArr->bounds) returnERROR; ,nElemCount=; va_listap; va_start(ap,nDim); ///i=nDim-1,使列优先 ;i>=;--i) { pArr->bounds[i]=va_arg(ap,int); ) returnERROR; nElemCount*=pArr->bounds[i]; } va_end(ap); ///初始化元素基址 pArr->base=(ElemType*)malloc(nElemCount*sizeof(ElemType)); if(!pArr->base) returnERROR; ///初始化函数映像常数基址 pArr->constants=(int*)malloc(nDim*sizeof(int)); ///递推求常量基址,列优先 pArr->constants[nDim-]=; ;i>=;--i) { pArr->constants[i]=pArr->bounds[i+]*pArr->constants[i+]; } returnOK; } /** *@brief销毁数组pArr * *@parampArr指向待销毁的数组 */ voidDestroyArray(Array*pArr) { if(pArr->base) free(pArr->base); if(pArr->bounds) free(pArr->bounds); if(pArr->constants) free(pArr->constants); } /** *@brief定位数组下标指向的元素在数组中的位置 * *@param指向的数组 *@param...数组的下标 * *@return若下标合法,返回下标在数组中的位置,否则返回ERROR */ intLocate(Array*pArr,intnDim,va_listap) { ,ind=,i=; ///列优先求地址 ;i>=;--i) { ind=va_arg(ap,int); ///使用断言,确保下标合法 assert(ind>=&&ind bounds[i]); nPos+=pArr->constants[i]*ind; } va_end(ap); returnnPos; } /** *@brief数组赋值 * *@parampArr指向待赋值的数组 *@paramelm指向赋值元素 *@paramnDim数组维数 *@param...数组下标 * *@param赋值成功返回OK,否则返回ERROR */ intAssign(Array*pArr,ElemType*elm,...) { ; va_listap; va_start(ap,elm); nPos=Locate(pArr,pArr->dim,ap); *(pArr->base+nPos)=*elm; returnOK; } /** *@brief数组取值 */ intValue(Array*pArr,ElemType*elm,...) { ; va_listap; va_start(ap,elm); nPos=Locate(pArr,pArr->dim,ap); *elm=*(pArr->base+nPos); printf("addr=0x%X\n",pArr->base+nPos); returnOK; } intmain() { Arrayarr; ///初始化一个三维数组,大小为2x3x5 InitArray(&arr,,,,); ; ///赋值测试 ,m=,n=; ;i<;++i) ;m<;++m) ;n<;++n) { a=i+m+n; Assign(&arr,&a,i,m,n); } ; ///取值测试 ;i<;++i) ;m<;++m) ;n<;++n) { Value(&arr,&b,i,m,n); printf("[%d][%d][%d]=%d\n",i,m,n,b); } ///销毁数组 DestroyArray(&arr); ; }
运行测试:
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。