二位数组传参及二位数组动态分配问题

//二位数组参数传递

//1.
void display1(int arr[][4], const int rows)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			cout << arr[i][j] << ‘ ‘;
		}
		cout << endl;
	}
	cout << endl;
}

//2.
void display2(int(*parr)[4], const int rows)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			cout << parr[i][j] << ‘ ‘;
		}
		cout << endl;
	}
	cout << endl;
}
//parr[i]等价于*(parr+i)

//3.
void display3(int **parr, const int rows, const int cols)
{
	for (int i = 0; i < rows; ++i)
	{
		for (int j = 0; j < cols; ++j)
		{
			cout << *((int*)parr + i * cols + j) << " ";   //注意:(parr+i*cols+j), 不是(arr+i*rows+j), 不能使用parr[i][j]
		}
		cout << endl;
	}
	cout << endl;
}

void display4(int **parr, const int rows, const int cols)
{
	for (int i = 0; i < rows; ++i)
	{
		for (int j = 0; j < cols; ++j)
		{
			cout << parr[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
}

int main()
{
	int rows = 3;
	int cols = 4;

	int arr[][4] = { 0,1,2,3,4,5,6,7,8,9,10,11 }; 

	display3((int**)arr, rows, cols);
	cout << "=======" << endl;

	//动态二位数组
	int **p;
	p = new int*[rows];//创建行指针
	for (int i = 0; i < rows; ++i)
	{
		p[i] = new int[cols]; //为每一行分配空间
	}

	for (int i = 0; i < rows; ++i)
		for (int j = 0; j < cols; ++j)
			p[i][j] = i * cols + j;

	display4(p, rows, cols);

	//删除行数组空间
	for (int i = 0; i < rows; ++i)
		delete[] p[i];

	//删除行指针
	delete[] p;
	p = nullptr;

	//一次性分配空间
	int **p1;
	p1 = new int*[rows];
	p1[0] = new int[rows*cols];
	for (int i = 0; i < rows; ++i)
		p1[i] = p1[0] + cols*i;

	for (int i = 0; i < rows; ++i)
		for (int j = 0; j < cols; ++j)
			p1[i][j] = i * cols + j;// 或者    *(p1[0]+i*cols+j) = i * cols + j;

	display4(p1, rows, cols);

	display3((int**)p1[0], rows, cols);

	delete[] p1[0];
	delete[] p1;
}

  

原文地址:https://www.cnblogs.com/xslwm/p/10349842.html

时间: 2024-10-10 02:52:54

二位数组传参及二位数组动态分配问题的相关文章

关于C语言中二维数组传参————————【Badboy】

直接上代码: #include void Fun(int *a[],int m,int n)// { printf("%d\t",*a);//[0][0] /* int e[2][2][2]={8,7,6,5,4,3,2,1}; int *f,***g; g=e; f=e;//有警告,但不会报错 printf("%d\n",*f); */ } /*解释: Fun()中的int *a[2]表示定义指针数组a[2],a[0],a[1]存储的都是指针, a表示的是数组的首

C++中二维数组传参的方法详解

C++中二维数组传参的方法详解 首先需要明确,C++中其实没有多维数组,所谓的多维数组,其实就是数组的数组: 另外,数组中元素的个数也是数组类型的一部分. 当一个数组的元素仍然是数组时,通常使用2个维度来定义它,一个数组表示数组本身的大小,另一个维度表示其元素大小(它的元素也是数组): int ia[3][4]; //大小为3的数组,每个元素是含有4个整数的数组 int (*p)[4] = ia;//p指向含有4个整数的数组(指向第一个内层数组) 1 将给定第二维长度的二维数组作为形参传递 #i

c/c++ 数组传参

在c/c++中,在进行数组传参时,数组的元素个数默认是不作为实参传入调用函数,也就是说c/c++ 不允许向函数传递一个完整的数组作为参数 实例: 1.形式参数是一个指针,实参包括数组长度: 1 void myFunction(int *param,int length){ 2 for (int i = 0; i<length - 1; i++) 3 { 4 cout << param[i] << "\t"<<endl; 5 } 6 } 2.形式

WebFlux系列(九)WebClient Uri列表、数组传参

#Java#Spring#WebFlux#Reactor#WebClient#Uri#传参#数组#列表# WebClient Uri列表.数组传参 视频讲解:  https://www.bilibili.com/video/av83351261/ 服务端: @RestController class EmployeeController { @GetMapping("employee") public Mono<String> requestList(@RequestPar

关于二维数组传参做形参(转)

二维数组的存储方式是和一维数组没什么区别,但是用二维数组做参数,它的形参该怎样写?要注意的是:函数中的形参其实就相当于一个声明,并不产生内存分配,形参的目的就是要让编译器知道函数参数的数据类型. 正确的是:void Func(int array[3][10]); void Func(int array[][10]);可以省略第一维的大小 错误的是void Func(int array[][].这样的用法只能在初始化时可以用);这样写也是错误:void Func(const int m,const

结构体和数组传参注意

;数组的传参默认是传的数组元素的首地址,所以在函数内部是无法得到数组的大小的需要传一个size进来 int a = {1,2,3}; sum(a,sizeof(a)/sizeof(a[0])); //此处传的是数组的首地址 ;结构体当作参数的时候要传地址,否则编译器传的是副本会产生很大的内存拷贝

LiveBOS Webservice传参类型为list数组

昨天有使用soap传输数据到Webservice,其中字符串类型的都已经传输成功,但是有几个参数传输失败,java服务器端收到的空值. 因为我是php的,然后接收端是java制作的,其中有几个参数是list数组类型的,我刚开始将php的数组传过去,服务端接收到的是空,然后再使用json格式还是不行.后来去询问java同事,他们说list数组类型不像php一样是有键值和键名的, java的list数组是只有name和value对应关系,如下所示 $arr = array('userid'=>1,'

ASP.Net内置对象之网页之间传参(二)

Session对象 运用于多个界面调用某一个特定的用户信息,也就是每个Session 对象是独立的,个不受影响. Session对象的读取和存储 Session[name]=”chen”; 可以用来界面之间参数传递 webForm1.aspx: Session["name"]="chen"; Response.Redirect("~/webForm2.aspx"); webForm2.aspx: Response.Write("welc

WebApi传参总动员(二)

上篇,从最简单的string入手.本篇演示了从请求的输入流中获取实体.api: public class ValuesController : ApiController { [HttpPost] public string GetData(string name) { return "我爱" + name; } [HttpPost] public string GetData() { var stream = HttpContext.Current.Request.InputStre