基于C ++语言的多维动态数组的实现

合集下载

C语言基础-实现动态数组并增加内存管理

C语言基础-实现动态数组并增加内存管理

C语⾔基础-实现动态数组并增加内存管理⽤C语⾔实现⼀个动态数组,并对外暴露出对数组的增、删、改、查函数(可以存储任意类型的元素并实现内存管理)这⾥我的编译器就是xcode分析:模拟存放⼀个 People类有2个属性字符串类型:姓名整型:年龄array 结构体应当有数组长度:length 空间:capacity 存储对象:value(任意类型)构造⼀个任意对象类.拥有retainCount属性.为内存计数器使⽤⼀次retainCount+1,当retainCount为0时释放该对象指向的内存贴出部分代码// Object.h#ifndef Object_h#define Object_h#include <stdio>//定义结构体typedef struct Object{int retainCount;}Object;//宏定义⽅法⽅便书写#define OBJECTRETAIN(obj) objectRetain((Object*)obj)#define OBJECTRELEASE(obj) objectRelease((Object*)obj)#define GETRETAINCOUNT(obj) getRetainCount((Object*)obj)void objectRetain(Object *obj);void objectRelease(Object *obj);int getRetainCount(Object *obj);#endif /* Object_h */// Object.c#include "Object.h"#include <stdlib>void objectRetain(Object *obj) {obj->retainCount ++;// printf("retain计数+1 = %d\n",obj->retainCount);}void objectRelease(Object *obj) {obj->retainCount --;if (obj->retainCount <= 0) {free(obj);}// printf("retain计数-1 = %d\n",obj->retainCount);}//获得当前计数int getRetainCount(Object *obj) {return obj->retainCount;}下⾯开始封装.⾸先是对原始数据的封装.1. 将char* 字符串类型封装成String// String.h#ifndef String_h#define String_h#include <stdio>typedef struct String{int retainCount;char *value;}String;String* newString(char* value);char* getStringValue(String* ins);#endif /* String_h */// String.c#include "String.h"#include <stdlib>#include "Object.h"String* newString(char* value){String *str = malloc(sizeof(String));OBJECTRETAIN(str);str->value = value;return str;}char* getStringValue(String* ins){return ins->value;}2.将年龄的类型int封装成Interger// Integer.h#ifndef Integer_h#define Integer_h#include <stdio>typedef struct Integer{int retainCount;int value;}Integer;Integer* newInteger(int value);int getIntegerValue(Integer* ins);#endif /* Integer_h */// Integer.c#include "Integer.h"#include <stdlib>#include "Object.h"Integer *newInteger(int value) {Integer *new = malloc(sizeof(Integer));OBJECTRETAIN(new);new->value = value;return new;}int getIntegerValue(Integer* ins) {return ins->value;}3.定义数组中存放的类包含 name 和 age 属性// People.h#ifndef People_h#define People_h#include <stdio>#include "Integer.h"#include "String.h"typedef struct People{int retainCount;String* name;Integer* age;}People;People* newPeople(String *name,Integer *age);String* getName(People* people);Integer* getAge(People* people);#endif /* People_h */// People.c#include "People.h"#include <stdlib>#include "Object.h"People* newPeople(String *name,Integer *age){People *newP = malloc(sizeof(People));OBJECTRETAIN(newP);newP->age = age;newP->name = name;return newP;}String* getName(People* people){return people->name;}Integer* getAge(People* people){return people->age;}4.准备⼯作都做完 ,下⾯我们来实现数组Array// Array.h#ifndef Array_h#define Array_h#include <stdio>#include "People.h"#include "Object.h"typedef Object* AnyObject;typedef struct Array{int length;int capacity;AnyObject *value;}Array;Array* newArray();//增加数组元素void addElement(Array *array,AnyObject value);//删除Array* removeIndexAt(Array *arry,int index);//插⼊Array* insertIndexAt(Array *array,AnyObject value,int index);//查找AnyObject getValueIndexAt(Array *array,int index);//获取数组长度int getArrayLength(Array *array);//销毁void destroyArray(Array *array);//打印void printArray(Array *arr);#endif /* Array_h */// Array.c#include "Array.h"#include <string>#include <stdlib>#include <assert>//分配空间static AnyObject* allocMemoryByCapacity(Array *arr){return malloc(sizeof(AnyObject) * arr->capacity);}//创建数组Array* newArray(){Array *arr = malloc(sizeof(Array));arr->length = 0;arr->capacity = 32;arr->value = allocMemoryByCapacity(arr);return arr;}//获取数组长度int getArrayLength(Array *array){return array->length;}//增加元素void addElement(Array *array,AnyObject value){if (array->length >= array->capacity) {array->capacity *= 2;AnyObject *oldValue = array->value;memcpy(array->value, oldValue, array->length*sizeof(AnyObject)); free(oldValue);}OBJECTRETAIN(value);array->value[array->length] = value;array->length++;}//删除元素Array* removeIndexAt(Array *arry,int index){assert(index >= 0 && index < arry>length); //断⾔防⽌越界OBJECTRELEASE(getValueIndexAt(arry, index));arry->length -- ;for (int i = index-1; i < arry>length; i++) {arry->value[i] = arry->value[i+1];}return arry;}//在指定位置增加元素Array* insertIndexAt(Array *array,AnyObject value,int index){if (array->length >= array->capacity) {array->capacity *= 2;AnyObject *oldValue = array->value;memcpy(array->value, oldValue, array->length*sizeof(AnyObject));free(oldValue);}array->length++;//插⼊指定位置array->value[index-1] = value;//将元素后移for (int i = index; i < array>length; i++) {array->value[array->length] = array->value[array->length-i];}OBJECTRETAIN(value);return array;}//获取某个元素AnyObject getValueIndexAt(Array *array,int index){assert(index >= 0 && index < array>length);return array->value[index];}//销毁void destroyArray(Array *array){free(array->value);free(array);printf("数组被销毁\n");}//打印结果void printArray(Array *arr){for (int i = 0; i < arr>length; i++) {printf("位置:%d,姓名:%s,年龄:%d\n",i, getStringValue(getName((People*)getValueIndexAt(arr, i))),getIntegerValue(getAge((People*)getValueIndexAt(arr, i)))); }}接下来就可以来测试数据了.// main.m#import <Foundation>#import "People.h"#import "Array.h"#import "Object.h"int main(int argc, const char * argv[]) {@autoreleasepool {Array *arr = newArray();People *p0 = newPeople(newString("张三"), newInteger(20));People *p1 = newPeople(newString("李四"), newInteger(16));People *p2 = newPeople(newString("王五"), newInteger(17));People *p3 = newPeople(newString("赵⼆"), newInteger(14));People *p4 = newPeople(newString("林三"), newInteger(22));People *p5 = newPeople(newString("⼩明"), newInteger(18));People *p6 = newPeople(newString("⼩红"), newInteger(25));People *p7 = newPeople(newString("⼩⽅"), newInteger(11));People *p8 = newPeople(newString("⼩花"), newInteger(19));People *p9 = newPeople(newString("⼩兔"), newInteger(22));People *p10 = newPeople(newString("新⼈"), newInteger(23));//增加元素addElement(arr, (Object *)p0);addElement(arr, (Object *)p1);addElement(arr, (Object *)p2);addElement(arr, (Object *)p3);addElement(arr, (Object *)p4);addElement(arr, (Object *)p5);addElement(arr, (Object *)p6);addElement(arr, (Object *)p7);addElement(arr, (Object *)p8);addElement(arr, (Object *)p9);//释放内存OBJECTRELEASE((Object*) p0);OBJECTRELEASE((Object*) p1);OBJECTRELEASE((Object*) p2);OBJECTRELEASE((Object*) p3);OBJECTRELEASE((Object*) p4);OBJECTRELEASE((Object*) p5);OBJECTRELEASE((Object*) p6);OBJECTRELEASE((Object*) p7);OBJECTRELEASE((Object*) p8);OBJECTRELEASE((Object*) p9);printf("增加10个元素\n");printArray(arr);printf("删除第3个元素\n");//删除第数组中某⼀个元素removeIndexAt(arr, 3);printArray(arr);printf("插⼊P10成为第4个元素\n");//插⼊insertIndexAt(arr, (Object *)p10, 4);printArray(arr);OBJECTRELEASE((Object*) p10);printf("查找第5个元素\n");//index从0开始查找第5个元素 index=4printf("位置:%d,姓名:%s,年龄:%d\n",4, getStringValue(getName((People*)getValueIndexAt(arr, 4))),getIntegerValue(getAge((People*)getValueIndexAt(arr, 4)))); //销毁数组destroyArray(arr);}return 0;}看下结果吧。

C语言中动态数组的实现

C语言中动态数组的实现

C语言中动态数组的实现在C语言中,动态数组的实现主要依靠指针和内存分配函数。

动态数组是在程序执行过程中根据需要动态分配内存空间的数组。

相比于静态数组,在编写代码时不需要提前指定数组的大小,可以更加灵活地适应不同数据量的需求。

C语言中的动态数组实现主要分为两个步骤:内存分配和内存释放。

1.内存分配:C语言提供了几种内存分配函数来动态分配内存空间,包括malloc、calloc、realloc等。

a) malloc函数:malloc函数用于从堆中分配指定大小的内存块,并返回该内存块的首地址。

其函数原型为:```cvoid* malloc(size_t size);```这里的size是以字节为单位的分配内存的大小。

分配成功时,返回分配内存的首地址;分配失败时,返回NULL。

b) calloc函数:calloc函数用于从堆中分配指定数量、指定大小的连续内存空间,并将该内存空间初始化为0。

其函数原型为:```cvoid* calloc(size_t num, size_t size);```这里的num是要分配的元素个数,size是每个元素的大小。

分配成功时,返回分配内存的首地址;分配失败时,返回NULL。

c) realloc函数:realloc函数用于重新调整之前分配的内存大小,并返回调整后的内存地址。

其函数原型为:```cvoid* realloc(void* ptr, size_t size);```这里的ptr是之前分配的内存地址,size是调整后的内存大小。

如果调整成功,返回调整后的内存地址;如果调整失败,返回NULL。

2.内存释放:动态数组使用完毕后,需要手动释放分配的内存空间,避免内存泄漏。

C语言中使用free函数来释放动态分配的内存空间,函数原型为:```cvoid free(void* ptr);```这里的ptr为之前分配的内存地址。

释放成功后,内存空间可以被重新分配使用;如果指针为空指针,则不进行任何操作。

c语言 多维数组

c语言 多维数组
main()
{
char s1[6]=addfgh,s2[5]=asdlg;
int i;
for(i=0;s1[i]!='\0'&&s2[i]!='\0';i++)
{
if(s1[i] {
printf(s1 exit(1);
}
else if(s1[i]>s2[i])
{
printf(s1>s2\n);
exit()函数的作用是退出程序,具体它的用法可以看看相关资料。
其实C语言把我们经常需要的字符串处理函数都做好了,我们只需要调用它即可。如strcmp()用来比较、strcpy()用来拷贝等等。看看它们的用法:
#include string.h
main()
{
char s1[10],s2[10],s2[10];
我们也可以对数组进行赋值,而不是初始化。
main()
{
int array[3][3];
int i,j;
for(j=0;j<3;j++)
for(i=0;i<3;i++) scanf(%d,&array[i][j]);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++) printf(%3d);
{
int array[2][3][4];
int i,j,k;
for(i=0;i<2;i++)
for(j=0;j<3;j++)

如何在C++中使用动态三维数组

如何在C++中使用动态三维数组

如何在C++中使⽤动态三维数组⽬录1. 使⽤new和delete来构造在使⽤new申请内存时,在使⽤过后,⼀定要采⽤delete来进⾏释放内存。

使⽤该⽅法创建动态数组时,需要由数组的⾓标依次向右进⾏创建;同时,也需要依照⾓标,从左到右来进⾏删除。

代码功能为:声明三维动态数组,将⾓标和进⾏相加并添加到mfc的list中,然后释放内存。

具体代码如下//声明三维数组,长处分别为X_Length,Y_Length,Z_Lengthint X_Length = 5, Y_Length = 6, Z_Length = 7;//长度定义double ***DD;//声明指针DD = new double **[X_Length];//定义X的长度for (int x = 0;x < X_Length; x++)//在X的内部,定义Y{DD[x] = new double *[Y_Length];//定义Y的长度for (int y = 0; y < Y_Length; y++)//在xy的内部,定义Z{DD[x][y] = new double [Z_Length];//定义Z的长度}}//数组的声明完成,可以对数组进⾏操作//⽐如将数组的⾓标的和,并显⽰在表格中int count_number = 0;for (int i = 0;i < X_Length; i++){for (int j = 0; j < Y_Length; j++){for (int k = 0; k < Z_Length; k++){DD[i][j][k] = i + j + k;CString temp;m_list.InsertItem(count_number,_T(""));temp.Format(_T("%d"),count_number+1);m_list.SetItemText(count_number,0,temp);temp.Format(_T("%d"),i);m_list.SetItemText(count_number,1,temp);temp.Format(_T("%d"),j);m_list.SetItemText(count_number,2,temp);temp.Format(_T("%d"),k);m_list.SetItemText(count_number,3,temp);temp.Format(_T("%f"),DD[i][j][k]);m_list.SetItemText(count_number,4,temp);count_number++;}}}//⽤完数组后,⽤delete将内存释放for (int y = 0; y < Y_Length; y++){delete [] DD[x][y];//释放Z这⼀层}}for (int x = 0; x < X_Length; x++){delete [] DD[x];//释放Y这⼀层}delete [] DD;//释放X这⼀层在进⾏⽣成数组时,⼀定要弄清楚x、y、z之间的关系。

动态数组c语言

动态数组c语言

动态数组c语言
动态数组是一种在程序运行期间可以动态增加或缩减大小的数组。

在C语言中,动态数组可以通过指针和指针算术来实现。

与静态数组相比,动态数组具有以下优点:
1.灵活性更高:动态数组的大小可以根据需要进行增加或缩减,因此可以适应不同的数据处理需求。

2.节省内存空间:由于动态数组是在程序执行期间分配内存空间,因此可以避免静态数组因为定义时已经分配了大量内存空间而造成空间浪费。

3.更为安全:动态数组可以避免静态数组因为数组越界而产生异常,从而保证程序的稳定性。

在C语言中,动态数组的实现可以借助于指针和动态内存分配函数。

以下是一个简单的动态数组示例,用于演示如何使用动态数组:
#include <stdio.h>
#include <stdlib.h>
在上面的程序中,首先要求用户输入动态数组的大小num。

然后,通过malloc函数动态分配内存空间来存储整型数据类型。

在输入动态数组元素的过程中,可以使用指针和指针算术来访问数组的元素。

在累加输入的整数元素之后,使用free函数释放动态分配的内存空间,并将指针ptr设置为NULL以避免悬挂指针的情况。

C、C++之动态数组的实现

C、C++之动态数组的实现

C、C++之动态数组的实现C、C++之动态数组的实现本篇博客基于笔者本⼈正在学习的C++上机课程作业,主要代码由C语⾔构成。

由于C语⾔没有 string 、vector、valarray等完善的类,所以在实现动态数组时,需要⾃⾏考虑内存的分配和管理,C语⾔中,对内存管理的函数如malloc、realloc、free等被包括在 < malloc .h >头⽂件中。

关于这些函数使⽤的具体实例,可以参考这篇⽂章:具体实现时,使⽤了某些 C++ 的特有语法,如在for循环⾥定义变量,这是C语⾔不允许的,但由于现有现有编译器⼀般都同时⽀持,因此不特别注明下⾯会贴出实验课上所⽤的测试代码,针对测试代码,可以发现,实现⼀个动态数组不难,因为已经有现成的函数可以调⽤,⽽针对数组的操作较多,需要逐⼀讨论测试⽂件如下:// LibArray.cpp : 定义控制台应⽤程序的⼊⼝点。

//// 实验内容:// 1:使⽤C语⾔实现⼀个长度可扩充的数组(包含必要的数据结构及函数);// 2:要求能存放任意类型的数据(建议先实现存储整形的代码,之后改写成适应任意类型的代码);// 3:所写程序需能通过测试程序// 4:除本⽂件(测试⽂件)之外,其他⽂件(如CLibArray.cpp及CLibArray.h⽂件)、以及⼯程由同学⾃⼰建⽴。

过程中可翻书,可查看msdn。

// 实验⽬的:// 1:熟悉相关的指针操作, 复习动态内存的相关操作.// 2:理解C程序如何实现数据类型和围绕数据类型上操作的集合// 3:为未来理解类实现的数组vector做准备// 只提交CLibArray.cpp及CLibArray.h#include "stdafx.h"#include <assert.h>#include<stdlib.h>#include "CLibArray.h"int _tmain(int argc, _TCHAR* argv[]){CArray array;array_initial(array);array_recap(array, 10);assert(array_capacity(array) == 10);//////////////////////////////////////////////////////////////////////////for (int i = 0; i < 20; ++i){array_append(array, i);}assert(array_size(array) == 20);for (int i = 0; i < array_size(array); ++i){assert(array_at(array, i) == i);}//////////////////////////////////////////////////////////////////////////CArray array2, array3;array_initial(array2);array_initial(array3);array_copy(array, array2);assert(array_compare(array, array2) == true);array_copy(array, array3);assert(array_compare(array, array3) == true);//////////////////////////////////////////////////////////////////////////array_insert(array2, 2, 3);assert(array_compare(array, array2) == false);//////////////////////////////////////////////////////////////////////////array_at(array3, 2) = 5;assert(array_compare(array, array3) == false);//////////////////////////////////////////////////////////////////////////array_destroy(array);array_destroy(array2);array_destroy(array3);return 0;}可以看出,⾸先要确定 CArray 的具体类型,以 int 型为例,动态数组具有可变的容量(capacity,已分配空间)和实际⼤⼩(size,已使⽤的空间),⽽malloc等函数的参数要求都是指针,因此,可以把 CArray 定义为结构体:// defination of CArraytypedef struct CArray{int* arrayhead;int size;int capacity;}CArray;注意,在结构体中(c++中,结构体可以看做是简单的类),是不允许初始化普通成员的,因为上述代码只是给出此类型的定义,⽽没有定义实际的变量。

C语言建立动态数组

C语⾔建⽴动态数组C语⾔建⽴动态数组数组的有点在于随机存取,然⽽其不⾜也是明显的,就是⼀旦建⽴其⼤⼩就不能改变。

若⽤数组存储数据,则必须创建⼀个可能存放的最⼤空间的数组,这⽆疑浪费了空间。

动态数组解决了这个问题。

动态数组的思路是:先建⽴⼀定⼤⼩的数组,向这个数组中存放数据,如果数组已满,则重新申请⼀个更⼤的空间来存放。

每次重新申请时可以指定增量(inc)的⼤⼩,也可以固定⼤⼩。

这样做的好处是空间浪费不多,最多浪费(inc-1)个元素空间,其不⾜是重新申请空间浪费时间,每次重新申请空间时须将原来的数据拷贝到新申请的空间,当数组很⼤时,这种浪费还是相当可观的。

稍后将⽤链表和数组结合解决这⼀问题。

先建⽴动态数组的存储结构:typedef unsigned char BOOL;typedef int elem_t; //存放数据类型typedef struct{int iCount; //数据个数(数组中实际存放元素的个数)int iCapacity; //容量(数组中能够容纳元素的最⼤个数)elem_t * pData; //数据指针(该指针指向存放数据空间的⾸地址)}Array_t;下⾯定义数组的基本操作,包括:1、初始化;2、设置元素的值;3、取得元素的引⽤(C语⾔中指地址);4、取得元素的值;5、销毁数组以下是上⾯五个操作的函数声明:BOOL initArray( Array_t * array, int size ); //初始化,size为指定初始化数组容量BOOL setValue( Array_t * array, int index, elem_t val ); //设置指定位置元素的值elem_t * getRef( Array_t * array, int index ); //得到指定位置元素的引⽤(地址)elem_t getValue( Array_t * array, int index ); //得到指定位置元素的值BOOL destroyArray( Array_t * array ); //销毁该数组以下是函数实现:#define INIT_DATA_NUM 10 //数组初始化⼤⼩,增量⼤⼩BOOL initArray( Array_t * array, int size ) //初始化,若size <= 0,则采⽤默认⼤⼩{BOOL bRet = FALSE;int initSize = (size > 0) ? size:INIT_DATA_NUM;array->pData = ( elem_t * )malloc( initSize * sizeof( elem_t) );if ( array->pData != NULL ){array->iCapacity = initSize;array->iCount = 0;bRet = TRUE;}return bRet;}BOOL setValue( Array_t * array, int index, elem_t val ) //设置指定位置元素的值{BOOL bRet = FALSE;if( index > 0 && index < array->iCount ){array->pData[index] = val;bRet = TRUE;}return bRet;}elem_t * getRef( Array_t * array, int index ) //得到指定位置元素的引⽤(地址){elem_t * eRet = NULL;if( index > 0 && index < array->iCount ){eRet = array->pData + index;}return eRet;}elem_t getValue( Array_t * array, int index ) //得到指定位置元素的值(不检查数组越界){return array->pData[index];}BOOL destroyArray( Array_t * array ) //销毁该数组{free( array->pData );array->pData = NULL;return TRUE;}这样关于动态数组的基本操作就完成了。

用carray解决多维动态数组问题

用carray解决多维动态数组问题对于任何一门语言而言,多维动态数组总是一个让人有点头疼的问题,一维与二维的设计不一样,顺序访问与随机访问的设计不一样。

如果在编程时需要实现高维数组,则又要翻出数据结构的书好好动一翻脑筋。

其实中需简单地扩展MFC提供的CArray模板类,就可以在C++中很容易地实现任意多维动态数组。

根据CArray的使用方法,如下的几行语句似乎就实现了三维动态整型数组:typedef CArray<int, int&> DA1;typedef CArray<DA1, DA1&> DA2;typedef CArray<DA2, DA2&> DA3;DA3 da3;da3似乎就是一个三维动态整型数组,而且是一个参差数组。

但直接这样编译会出错,原因是CArray没有定义“=”运算符。

为解决这个问题可以定义一个CArray的导出类。

代码如下:// UltraCArray_T.h///////////////////////////////////////////////////////////////////// ///#if !defined(AFX_ULTRACARRAY_T_H__552AA3BD_C40E_409 0_B373_53767023912A__INCLUDED_)#defineAFX_ULTRACARRAY_T_H__552AA3BD_C40E_4090_B373_5376702 3912A__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include <Afxtempl.h>template <class TYPE, class ARG_TYPE>class UltraCArray_T : public CArray <TYPE, ARG_TYPE>{public:void operator =(const UltraCArray_T<TYPE, ARG_TYPE> &rhs);};template <class TYPE, class ARG_TYPE>void UltraCArray_T<TYPE, ARG_TYPE>::operator =(const UltraCArray_T<TYPE, ARG_TYPE> &rhs) {RemoveAll();Append(rhs);}#endif //!defined(AFX_ULTRACARRAY_T_H__552AA3BD_C40E_4090_B 373_53767023912A__INCLUDED_)使用UltraCArray_T即可实现任意多维的动态参差数组。

动态创建多维数组的技巧

动态创建多维数组的技巧首先,让我们回顾一下多维数组的定义和特点。

多维数组是一个由数组元素组成的结构,其中每个元素也可以是一个数组。

多维数组的维度可以是任意的,比如二维数组、三维数组、甚至更高维的数组。

为了动态创建多维数组,我们需要了解一些基本概念。

一种常见的方法是使用嵌套循环来创建多维数组。

例如,创建一个3x3的二维数组可以使用以下代码:```int[][] arr = new int[3][3];```这将创建一个3行3列的二维数组,每个元素都初始化为0。

我们可以使用嵌套循环来遍历和操作数组的元素。

这个方法适用于创建任意维度的数组,只需要添加相应的维度大小即可。

一种常用的技巧是使用`new`关键字和循环来动态分配内存并创建多维数组。

以下是一个示例:```javaint[][] arr = new int[3][]; // 定义二维数组的第一个维度大小为3for (int i = 0; i < arr.length; i++)arr[i] = new int[3]; // 为每一行定义第二个维度的大小为3```这将创建一个3行3列的二维数组,但每一行的列数可以是不同的。

我们可以使用嵌套循环来遍历和操作数组的元素。

除了上述方法,还可以使用数组的`length`属性来动态创建多维数组。

例如,下面的示例创建了一个3x3x3的三维数组:```javaint[][][] arr = new int[3][][];arr[0] = new int[3][];arr[1] = new int[3][];arr[2] = new int[3][];for (int i = 0; i < arr.length; i++)for (int j = 0; j < arr[i].length; j++)arr[i][j] = new int[3];}```这将创建一个3x3x3的三维数组,每个元素都初始化为0。

如何在VC中创建动态数组

如何在VC中创建动态数组怎样给多维数组动态分配内存//Allocate:int **p = new int* [m];for(int i = 0 ; i < m ; i++)p[i] = new int[n];//Use:for(int i = 0 ; i < m; i++)for(int j = 0 ; j < n ; j++)p[i][j] = i * j;//Free:for(int i = 0 ; i < m ; i++)delete[] p[i];delete[] p;1. 演示形为int[2][3]的二维动态数组/////////////////////////////////////////////////////////////////// int n1, n2;const int DIM1 = 2;const int DIM2 = 3;// 构造数组int **ppi = new int*[DIM1];for(n1 = 0; n1 < DIM1; n1++){ppi[n1] = new int[DIM2];}// 填充数据for(n1 = 0; n1 < DIM1; n1++){for(n2 = 0; n2 < DIM2; n2++){ppi[n1][n2] = n1 * 10 + n2;}}// 输出for(n1 = 0; n1 < DIM1; n1++){for(n2 = 0; n2 < DIM2; n2++){afxDump << "ppi[" << n1 << "][" << n2 << "] = "<< ppi[n1][n2] << "\n";}}// 释放数组for(n1 = 0; n1 < DIM1; n1++){delete [] ppi[n1];}delete [] ppi;2. 三维动态数组(int[2][3][4])///////////////////////////////////////////////////////////////////int n1, n2, n3;const int DIM1 = 2;const int DIM2 = 3;const int DIM3 = 4;// 构造数组int ***ppi = new int**[DIM1];for(n1 = 0; n1 < DIM1; n1++){ppi[n1] = new int*[DIM2];for(n2 = 0; n2 < DIM2; n2++){ppi[n1][n2] = new int[DIM3];}}// 填充数据for(n1 = 0; n1 < DIM1; n1++){for(n2 = 0; n2 < DIM2; n2++){for(n3 = 0; n3 < DIM3; n3++){ppi[n1][n2][n3] = n1 * 100 + n2 * 10 + n3;}}}// 输出for(n1 = 0; n1 < DIM1; n1++){for(n2 = 0; n2 < DIM2; n2++){for(n3 = 0; n3 < DIM3; n3++){afxDump << "ppi[" << n1 << "][" << n2 << "][" << n3 << "] = "<< ppi[n1][n2][n3] << "\n";}}}// 释放数组for(n1 = 0; n1 < DIM1; n1++){for(n2 = 0; n2 < DIM2; n2++){delete [] ppi[n1][n2];}delete [] ppi[n1];}delete [] ppi;如何动态创建一个数组如果是一维的,int *arr; //可以是其它类型(char, float...)arr = new int[n]; //n 必须是整型变量二维的呢,这样来,int **arr;int n,m;cin >> n >> m;arr = new int*[n];for(int i=0;i<n;i++) { arr[i] = new int[m]; }上面的代码就可以通过动态输入n,m来实现二维数组的定义。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

A src : h n d aig wihc mpe n x esv aab s do h iu l b t t W e e l t o lx a d e c sied t ae n tevs a a n C
ln u g , s l e dt s h u— a g a e weu al n e ou et em l y
立 呢?
2 多维动 态数 组 的实 现
2 1 二 维 动 态 数 组 的 实现 .
同样 , 二维动态 数 组要 用 到指针 ,e 和 dl e 算 nw et运 e
t i n i n ld n mi a r y . ti i c mp e n b c r e sn h o n o e t b ih t emu t i e so a y a i a — i me so a y a c r a s Bu o l x a do s u e wh n u i g t ep i t s a l h l d m n in l n m c r d ts t s i d
要: 在用 V sa C 语言 处理复 杂和庞 大的数据 时, iul 常需要 用到多难动 态数组来管理 , 开辟 多堆动 态数组 时指针 但
的使 用是极为复杂和难 于理 解的 。针对这 一问题 , 利用“ 递推” 思想进行研 究, 出快速 有效地 建 立多堆动 态数组 的 C 的 给 代码 的思路和 方法, 并给 出详细代码 。经过验证此方法是可行的 , 而为较好地解 决这 类问题 带来很大的方便 。 从 关键词 : 多堆 ; 态数组 ; 代码 , i a C 动 C Vs l u 中圈分类号 : P 1 T 32 文献标识码 : B 文章编 号:0 4— 7 X(0 6 2 0 8 2 10 3 3 20 )4— 6 —0
I lm e to u t me so lDy a c Ar a s i mp e n fM li di n i na n mi r y n C++
ZHANG e i LI Peg o CAO n Xu bn , U i u , Bi g
( . n t u eo eto i ce c n g n e ig Na in I ie st fDee c c n lg , h n s a 4 0 7 。 h n 1 I s i t f c r ncS in e a d En ie rn , t a Un v r i o fn eTe h oo y C a g h , 1 0 3 C ia t El o y 2 S a d r r e inI si t n o v , h n h i2 0 3 C ia . t n a d C i r n tt i f t o u o Na y S a g a , 1 0 5, hn )
Ke wo d I l d me so a ; y a c a r y y r s mu t i n in l d n mi r a s C i
c d s Vi u lC o e ; s a
d u l *a r y o be ra ;
1 引 言
C + 言是 目前应 用极 为广 泛 的编程 语 言 在用 这 +语 种语言 的程序设计 中 , 数组 在数据 处理 中是不 可缺少 的 。 例如 , 在矩阵处理 中需要 用到二维数 组 ; 空间 的描述 要 对 用三维 数组 ; 在描 述信号 的时空 四维空 间中 , 离散 的信 号 要用到 四维数组 。在基 于灵活 、 用性好 的前 提下 , 些 通 这 数组 中组的个数和元素的多少常是根据具体情 况而定 的。 此 时采用常规 的多维静态数组是不可取 的 。因此 , 如何有 效简洁地建立多维动态数组 , 对于方便处理 随机 多维动态 数据来说具有重要的意义 。 通 常使用指针来实现一维 、 二维动态数组是 较为方便
维普资讯
张雪彬等: 基于 c 语言的多维动态数组的实现 ¨
基于 C + + 语言的多维动态数组的实现
张 雪彬 刘培 国 曹 兵 。 , ,
(. 1 国防科学技术大学 电子科学 与工程学 院 湖南 长 沙 摘 4 7 ;. 1 0 3 2 海军标准 规范所 上海 2 0 3 ) 10 5
a r ys ra .
c d sa egv n a d wep o et e r o rc. tS c n e in o e l g wi h ldme so a y a c o e r ie n rv h ya ec re t I o v ne tf rd ai t te mut i n in l n mi n h i d
ry .O tep p rgv sa fet emeh d t ul h l dme s n ld n mi ra sa c r ig t h d a 0 e u so . a s S h a e ie n efci t o o b i t emut i n i a y a ca ry co dn o t eie frc r in v d i o Th eal ed ti C
i l ntK K 一 1 0l 0
ary— nw d u l K] ra e o be[ ;
K 的值也可 以由含有变量的 函数给 出, 从而数组 是动 态 的。在数组用完后 , 要用下 面的语 句释放 内存 dl e[ et ] e
ar ay} r
多维数组 比一 维数 组复 杂 约 多 , 何 正确快 捷 的建 如
相关文档
最新文档