C++ 二维数组传参的四种方式

 更新时间:2024年04月18日 09:53:36   作者:虚拟笔记使  
C++的二维数组里面,通过用数组名传参,传过去后数组名会退化成一个一维数组指针,所以C++的函数参数不能像C语言一样去写,本文主要介绍了C++ 二维数组传参的四种方式,具有一定的参考价值,感兴趣的可以了解一下

最近刚开始刷剑指offer,刚做到第三题的时候,发现C++二维数组的传参方式和C语言略有些不同,所以在这篇博客中,会列出C/C++常见的二维数组传参方式。(本方式和代码都是基于vs环境所编写)

 一.C语言二维数组传参方式

C语言二维数组传参一般有三个方式。 

1.指针形式接收

#include<stdio.h>

void Print1(int* parr, int rows, int cols)//指针,行数,列数
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			printf("%2d ", *(parr + i * cols + j));
		}
		printf("\n");
	}
	printf("\n");
}

int main()
{
	int arr[][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20} };
	Print1(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]) / sizeof(arr[0][0]));
	return 0;
}

2. 数组形式接收

#include<stdio.h>

void Print2(int parr[][5], int rows, int cols)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			printf("%2d ", parr[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

int main()
{
	int arr[][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20} };
	Print2(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]) / sizeof(arr[0][0]));
	return 0;
}

3.数组指针形式接收

void Print3(int(*arr)[5], int rows, int cols)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			printf("%2d ", (*(arr + i))[j]);
		}
		printf("\n");
	}
	printf("\n");
}

int main()
{
	int arr[][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20} };
	Print3(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]) / sizeof(arr[0][0]));
	return 0;
}

一般来说,第一种更为常见,更加通用,因为第二、三种方法需要在函数中写明二维数组的列数,而一般情况下是不知道的。

二.C++二维数组传参方式

当我写完C语言二维输出传参方式后,接着用C语言写,发现C语言的第一种写法不适用于C++,会直接报错。

 原因:

在C语言里面,不管是一维数组还是二维数组,通过用数组名的传参方式,传过去后,数组名都会退化成一个指针指向第一个元素的指针。

而在C++的二维数组里面,通过用数组名传参,传过去后数组名会退化成一个一维数组指针,即这个指针是指向一个一维数组的。

如下图所示:

所以C++的函数参数不能像C语言一样去写。 

1. 数组指针形式接收

#include<iostream>
using namespace std;

void Print1(int (*parr)[5], int rows, 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 arr[][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20} };
	Print1(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]) / sizeof(arr[0][0]));
	return 0;
}

2.指针形式接收

第一种方式参数要指明多少列,如果我们不想这样写可以吗,答案是可以的,我们还是可以像C语言的第一种写法一样去写,但是调用函数时的参数需要做出一些改变。 

传arr改为传arr[0][0]的地址

#include<iostream>
using namespace std;

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

int main()
{
	int arr[][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20} };
    //函数第一个参数改为传arr[0][0]的地址
	Print2(&arr[0][0], sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]) / sizeof(arr[0][0]));
	return 0;
}

3. 引用方式传参

void Print3(int(&parr)[4][5],int rows,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 arr[][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20} };
	Print3(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]) / sizeof(arr[0][0]));
	return 0;
}

这种引用方式传参要指定行和列,所以也不好用,但是好在C++支持模板,所以可以使用模板来优化。

4.引用+模板

template<size_t row, size_t col>
void Print4(int(&parr)[row][col])
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			cout << parr[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
}

int main()
{
	int arr[][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20} };
	Print4(arr);
	return 0;
}

通过使用引用+模板的方式传参,通过使用模板,编译器会自动推导数组的行数和列数。

到此这篇关于C++ 二维数组传参的四种方式的文章就介绍到这了,更多相关C++ 二维数组传参内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C++实现图的邻接矩阵表示

    C++实现图的邻接矩阵表示

    这篇文章主要为大家详细介绍了C++实现图的邻接矩阵表示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • ubuntu系统vscodeC++编译环境配置与使用方式

    ubuntu系统vscodeC++编译环境配置与使用方式

    这篇文章主要介绍了ubuntu系统vscodeC++编译环境配置与使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • C语言制作简易金山打字通功能的代码

    C语言制作简易金山打字通功能的代码

    今天小编就为大家分享一篇关于C语言制作简易金山打字通功能的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言实现扫雷游戏(可展开)

    C语言实现扫雷游戏(可展开)

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏,实现扫雷展开和提醒,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • c++11多种格式时间转化为字符串的方法实现

    c++11多种格式时间转化为字符串的方法实现

    本文主要介绍了c++11多种格式时间转化为字符串的方法实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C++事件处理中__event与__raise关键字的用法讲解

    C++事件处理中__event与__raise关键字的用法讲解

    这篇文章主要介绍了C++事件处理中__event与__raise关键字的用法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • C语言指针和数组深入探究使用方法

    C语言指针和数组深入探究使用方法

    在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活
    2022-08-08
  • C++ Vector用法详解

    C++ Vector用法详解

    这篇文章主要介绍了C++ Vector用法详解,vector是C++标准模版库(STL,Standard Template Library)中的部分内容,本文详细介绍了它的方方面面,需要的朋友可以参考下
    2015-07-07
  • QML与C++几种交互方式

    QML与C++几种交互方式

    QML作为构建界面的语言是非常简洁的,但是界面的后台有些时候是经常要与C++交互的,本文主要介绍了QML与C++几种交互方式,感兴趣的可以了解一下
    2024-04-04
  • C语言超细致讲解分支语句

    C语言超细致讲解分支语句

    分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句
    2022-05-05

最新评论