C++ 二維數(shù)組傳參的四種方式
最近剛開(kāi)始刷劍指offer,剛做到第三題的時(shí)候,發(fā)現(xiàn)C++二維數(shù)組的傳參方式和C語(yǔ)言略有些不同,所以在這篇博客中,會(huì)列出C/C++常見(jiàn)的二維數(shù)組傳參方式。(本方式和代碼都是基于vs環(huán)境所編寫(xiě))
一.C語(yǔ)言二維數(shù)組傳參方式
C語(yǔ)言二維數(shù)組傳參一般有三個(gè)方式。
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; }
一般來(lái)說(shuō),第一種更為常見(jiàn),更加通用,因?yàn)榈诙?、三種方法需要在函數(shù)中寫(xiě)明二維數(shù)組的列數(shù),而一般情況下是不知道的。
二.C++二維數(shù)組傳參方式
當(dāng)我寫(xiě)完C語(yǔ)言二維輸出傳參方式后,接著用C語(yǔ)言寫(xiě),發(fā)現(xiàn)C語(yǔ)言的第一種寫(xiě)法不適用于C++,會(huì)直接報(bào)錯(cuò)。
原因:
在C語(yǔ)言里面,不管是一維數(shù)組還是二維數(shù)組,通過(guò)用數(shù)組名的傳參方式,傳過(guò)去后,數(shù)組名都會(huì)退化成一個(gè)指針指向第一個(gè)元素的指針。
而在C++的二維數(shù)組里面,通過(guò)用數(shù)組名傳參,傳過(guò)去后數(shù)組名會(huì)退化成一個(gè)一維數(shù)組指針,即這個(gè)指針是指向一個(gè)一維數(shù)組的。
如下圖所示:
所以C++的函數(shù)參數(shù)不能像C語(yǔ)言一樣去寫(xiě)。
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ù)要指明多少列,如果我們不想這樣寫(xiě)可以嗎,答案是可以的,我們還是可以像C語(yǔ)言的第一種寫(xiě)法一樣去寫(xiě),但是調(diào)用函數(shù)時(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ù)第一個(gè)參數(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++支持模板,所以可以使用模板來(lái)優(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; }
通過(guò)使用引用+模板的方式傳參,通過(guò)使用模板,編譯器會(huì)自動(dòng)推導(dǎo)數(shù)組的行數(shù)和列數(shù)。
到此這篇關(guān)于C++ 二維數(shù)組傳參的四種方式的文章就介紹到這了,更多相關(guān)C++ 二維數(shù)組傳參內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++和OpenCV實(shí)現(xiàn)圖像字符化效果
圖像字符化的意思是將圖像以字符形式呈現(xiàn),具有一定的娛樂(lè)價(jià)值,許多開(kāi)發(fā)人員通過(guò)python實(shí)現(xiàn)該功能,C++實(shí)現(xiàn)的代碼較少,因此本文通過(guò)C++和OpenCV實(shí)現(xiàn),給予C++開(kāi)發(fā)人員一些可供借鑒的思路,需要的朋友可以參考下2022-06-06C++找出字符串中出現(xiàn)最多的字符和次數(shù),時(shí)間復(fù)雜度小于O(n^2)
今天小編就為大家分享一篇關(guān)于C++找出字符串中出現(xiàn)最多的字符和次數(shù),時(shí)間復(fù)雜度小于O(n^2),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12C++日期與時(shí)間 chrono庫(kù)介紹及使用教程
chrono庫(kù)是C++11中的一個(gè)標(biāo)準(zhǔn)庫(kù),它提供了一系列與時(shí)間相關(guān)的類和函數(shù),用于表示和處理時(shí)間間隔,時(shí)鐘和時(shí)間點(diǎn),C++20新增Calendar,這篇文章主要介紹了C++日期與時(shí)間 chrono庫(kù)介紹及使用,需要的朋友可以參考下2023-12-12C++11中初始化列表initializer lists的使用方法
C++11引入了初始化列表來(lái)初始化變量和對(duì)象,自定義類型,如果想用初始化列表就要包含initializer_list頭文件2021-09-09C語(yǔ)言報(bào)錯(cuò):Format String Vulnerability的多種解決方案
Format String Vulnerability(格式化字符串漏洞)是C語(yǔ)言中常見(jiàn)且嚴(yán)重的安全漏洞之一,它通常在程序使用不受信任的輸入作為格式化字符串時(shí)發(fā)生,本文將詳細(xì)介紹Format String Vulnerability的產(chǎn)生原因,提供多種解決方案,需要的朋友可以參考下2024-06-06