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)文章
C++找出字符串中出現(xiàn)最多的字符和次數(shù),時間復(fù)雜度小于O(n^2)
今天小編就為大家分享一篇關(guān)于C++找出字符串中出現(xiàn)最多的字符和次數(shù),時間復(fù)雜度小于O(n^2),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12C++11中初始化列表initializer lists的使用方法
C++11引入了初始化列表來初始化變量和對象,自定義類型,如果想用初始化列表就要包含initializer_list頭文件2021-09-09C語言報錯:Format String Vulnerability的多種解決方案
Format String Vulnerability(格式化字符串漏洞)是C語言中常見且嚴(yán)重的安全漏洞之一,它通常在程序使用不受信任的輸入作為格式化字符串時發(fā)生,本文將詳細(xì)介紹Format String Vulnerability的產(chǎn)生原因,提供多種解決方案,需要的朋友可以參考下2024-06-06