C++ 二維數(shù)組傳參的四種方式
最近剛開始刷劍指offer,剛做到第三題的時候,發(fā)現(xiàn)C++二維數(shù)組的傳參方式和C語言略有些不同,所以在這篇博客中,會列出C/C++常見的二維數(shù)組傳參方式。(本方式和代碼都是基于vs環(huán)境所編寫)
一.C語言二維數(shù)組傳參方式
C語言二維數(shù)組傳參一般有三個方式。
1.指針形式接收
#include<stdio.h>
void Print1(int* parr, int rows, int cols)//指針,行數(shù),列數(shù)
{
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. 數(shù)組形式接收
#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.數(shù)組指針形式接收
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;
}一般來說,第一種更為常見,更加通用,因為第二、三種方法需要在函數(shù)中寫明二維數(shù)組的列數(shù),而一般情況下是不知道的。
二.C++二維數(shù)組傳參方式
當(dāng)我寫完C語言二維輸出傳參方式后,接著用C語言寫,發(fā)現(xiàn)C語言的第一種寫法不適用于C++,會直接報錯。

原因:
在C語言里面,不管是一維數(shù)組還是二維數(shù)組,通過用數(shù)組名的傳參方式,傳過去后,數(shù)組名都會退化成一個指針指向第一個元素的指針。
而在C++的二維數(shù)組里面,通過用數(shù)組名傳參,傳過去后數(shù)組名會退化成一個一維數(shù)組指針,即這個指針是指向一個一維數(shù)組的。
如下圖所示:

所以C++的函數(shù)參數(shù)不能像C語言一樣去寫。
1. 數(shù)組指針形式接收
#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.指針形式接收
第一種方式參數(shù)要指明多少列,如果我們不想這樣寫可以嗎,答案是可以的,我們還是可以像C語言的第一種寫法一樣去寫,但是調(diào)用函數(shù)時的參數(shù)需要做出一些改變。
傳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} };
//函數(shù)第一個參數(shù)改為傳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++支持模板,所以可以使用模板來優(yōu)化。
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;
}通過使用引用+模板的方式傳參,通過使用模板,編譯器會自動推導(dǎo)數(shù)組的行數(shù)和列數(shù)。
到此這篇關(guān)于C++ 二維數(shù)組傳參的四種方式的文章就介紹到這了,更多相關(guān)C++ 二維數(shù)組傳參內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ubuntu系統(tǒng)vscodeC++編譯環(huán)境配置與使用方式
這篇文章主要介紹了ubuntu系統(tǒng)vscodeC++編譯環(huán)境配置與使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
c++11多種格式時間轉(zhuǎn)化為字符串的方法實現(xiàn)
本文主要介紹了c++11多種格式時間轉(zhuǎn)化為字符串的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
C++事件處理中__event與__raise關(guān)鍵字的用法講解
這篇文章主要介紹了C++事件處理中__event與__raise關(guān)鍵字的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2016-01-01

