1. 程式人生 > >C++傳遞二維陣列

C++傳遞二維陣列

c++之所以強大,其中重要原因之一就是支援指標,然而這也是c++最令人頭痛的問題之一,其中二維陣列作為引數傳遞就是其中之一。

一、關於一維陣列

C++中一維陣列作為函式引數傳遞應用十分普遍,原理和操作都十分簡單。陣列名就代表了陣列的首地址,下標就是偏移量。函式的形式引數宣告為一級指標即可(Type *),而實參就是陣列名。

二、擴充套件到二維陣列

一維的情況解決了,接下來擴充到二維的情形。思路同前,採用二級指標引用二維陣列(Type**)從而得到如下程式:

#include "stdafx.h"
#include<iostream>
using namespace std;

void test(int m[][15],int i,int j){
     for(int a=0;a<i;a++){
        for(int b=0;b<j;b++){
            m[a][b] = b;
        }
    }
}

int print(int m[][15],int i,int j){
    for(int a=0;a<i;a++){
        for(int b=0;b<j;b++){
            cout<<m[a][b]<<",";
        }
        cout<<endl;
    }
    return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
    int m[15][15],i,j;
    i = 15;j = 15;
    test(m,i,j);
    print(m,i,j);
    return 0;
}

可是對左邊的程式進行編譯卻會報告錯誤: 錯誤 1 error C2664: “test”: 不能將引數 1 “int [15][15]” 轉換為“int **”

呵呵,問題來了吧,不能將這個二維陣列轉化而二級指標。好,既然這樣,那我就把形參宣告為二維陣列而不是二級指標。對左邊函式宣告修改如下:

void test(int **m,int i,int j) 改為:

void test(int m[][],int i,int j)

可是這樣一來有出現了新的問題: 不能將引數 1 “int [15][15]” 轉換為“int [][1]

原來陣列大小匹配不了,於是很容易想到將地二維大小明確給出,而不是預設值。

void test(int m[][15],int i,int j)

OK 搞定!

上面的解決方案雖然解決了燃眉之急,但畢竟不優雅,因為作為函式你必須保證聲明瞭足夠大的空間,但是究竟多大才是安全的呢?誰也不知道。下面的解決方案就優雅得多了

#include "stdafx.h"
#include<iostream>
using namespace std;

void test(int **m,int i,int j){
     for(int a=0;a<i;a++){
        for(int b=0;b<j;b++){
            m[a][b] = b;
        }
    }
}

int print(int **m,int i,int j){
    for(int a=0;a<i;a++){
        for(int b=0;b<j;b++){
            cout<<m[a][b]<<",";
        }
        cout<<endl;
    }
    return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
    int **m,i,j;
    i = 15;j = 15;
    m = new int*[i];
    for(int c=0;c<i;c++)
        m[c] = new int[j];
    test(m,i,j);
    print(m,i,j);
    return 0;
}

相關推薦

C++傳遞陣列

c++之所以強大,其中重要原因之一就是支援指標,然而這也是c++最令人頭痛的問題之一,其中二維陣列作為引數傳遞就是其中之一。 一、關於一維陣列 C++中一維陣列作為函式引數傳遞應用十分普遍,原理和操作都十分簡單。陣列名就代表了陣列的首地址,下標就是偏移量。函式的形式引數宣告為一級指標即可(Type *),

C#呼叫C++的dll傳遞陣列

1.C++中標頭檔案.h extern "C" MATHFUNCSDLL_API  int  __stdcall CallTest(int** arr, int rows, int cols); 2.C++中原始檔.cpp int __stdcall CallTest

C語言傳遞陣列

方法一, 形參給出第二維的長度。 例如: #include <stdio.h> void func(int n, char str[ ][5] ) { int i; for(i = 0; i < n; i++) printf("/nstr[%d] = %s/n"

C++】函式如何傳遞陣列陣列是怎麼通過指標進行傳遞

舉例子: int data[3][4] ={ {1,2,3,4} , {5,6,7,8} , {9,10,11,12} }; int total = sum(data,3); 請自己先嚐試寫出sum函式的原型 思考過後,請繼續看下面詳細分析:

C語言-----陣列

二維陣列的建立,初始化,使用。 (一)二維陣列的建立 二維陣列定義的一般形式:型別說明符 陣列名[常量表達式][常量表達式] 舉例如下: int a[3][4]; //定義a為 3*4(3行4列) 的陣列。 二位陣列又可以看作是一種特殊的一維陣列:它的元素又是一個一維陣列

C語言陣列指標練習

描述 程式填空,使其輸出結果是: 1,2,3,4, 10,12,14,16, 18,20,11,12, #include <iostream> using namespace std; void Double(int * p, int n) { for(int i = 0;i

15. C語言 -- 陣列

本部落格主要內容為 “小甲魚” 視訊課程《帶你學C帶你飛》【第一季】 學習筆記,文章的主題內容均來自該課程,在這裡僅作學習交流。在文章中可能出現一些錯誤或者不準確的地方,如發現請積極指出,十分感謝。 也歡迎大家一起討論交流,如果你覺得這篇文章對你有所幫助,記得評論、點贊哦 ~(。

C/C++獲取陣列行列數

對於type array[A][B];形式的二維陣列,可以通過計算sizeof獲取行列數。 sizeof(array[0][0])為一個元素佔用的空間, sizeof(array[0])為一行元素佔用的空間, sizeof(array)為整個陣列佔用的空間, 行數 = sizeof(ar

[C語言]陣列傳參的格式(詳細+總結)

喜歡就為我點贊,評論加收藏。 轉載請標明出處[link]https://blog.csdn.net/qq_43868654/article/details/84641383 初遇二維陣列作函式引數,宛如自己化身為了大頭兒子。很頭大。 不禁大聲吶喊:該怎麼宣告定義,該怎麼呼叫,又該怎麼

c++vector陣列的使用 記錄

#include <iostream> #include <vector> #include <algorithm> using namespace std; bool compare(const vector<int>&

C++ vector陣列

C++ 構建二維動態陣列 int **p; p = new int*[10]; //注意,int*[10]表示一個有10個元素的指標陣列 for (int i = 0; i < 10; ++i) { p[i] = new int[5]; } 這樣就

C#中陣列int[,]與交叉陣列int[][]的區別

首先說一下交叉陣列這個東西是C#裡面的,c++裡面是沒有的交叉陣列這個定義的   int[][] 是陣列的陣列,即一個一維陣列的每個元素都是一個數組,這個在C++,java等語言裡面也是這麼定義的; int[,]這個是C#中提供的一個二維陣列的形式,在C++中並不存在

關於C++的陣列的一個問題與解決

最近在做一個專案,過程中new了一個二維陣列來儲存中間變數。因為這些變數用完後就沒有用了再加上陣列規模有點大,就想把它刪除釋放空間。 double(*p1)[3 * length] = new double[number][3 * length]; 然而在刪除陣列過

C語言陣列的指標及首地址問題

若arr是一維陣列名,我們知道*arr就是arr[0],就是*(arr+0)。因為arr是陣列的首地址,*arr就是取首地址所指元素,就是陣列的第一個元素。同樣的道理,arr是二維陣列名時,*arr也是取arr的第一個元素,但是此時arr所指的元素是一個一維陣列,所以,實

C/C++】陣列之簡易三子棋

一、三子棋 五子棋,五個棋子不論是橫著,豎著,斜著,只要能連成一條直線,就贏了 三子棋(簡易版)也是如此。 二、思路分析 ①棋的型別 棋類的C語言實現方法主要看棋的型別 一種是像象棋那種,需要選擇棋子,進行的是棋子移動的棋 另一種,就是像三子棋,五子棋一樣。放置棋子的棋 ②

C/C++中陣列和指標關係分析

        在C/c++中,陣列和指標有著密切的關係,有很多地方說陣列就是指標式錯誤的一種說法。這兩者是不同的資料結構。其實,在C/c++中沒有所謂的二維陣列,書面表達就是陣列的陣列。我猜想是為了表述方便才叫它二維陣列。       在本文中,我也就叫它二維陣列。在C/C

c++中陣列向量的長度

對於一個二維陣列: int mm[3][5] = { { 1,2,3,4,5 },{ 5,6,7,8,9 },{ 9,10,11,12,13 } }; int toatlnums = sizeof(mm) / sizeof(int); //元素總個數 int cols =

C++動態陣列記憶體的分配和釋放 opencv

二維陣列動態陣列分配和釋放首先,陣列指標和指標陣列的區別:<p style="line-height: 18px; background-color: rgb(255, 255, 255); margin: 10px auto; font-family: Verdan

c語言陣列在子函式中的傳址

    在學習c語言的過程中,指標與二維陣列的傳值,傳址一直是我比較混淆的部分,今天做了一個較為完整的總結   一.自己定義的陣列傳址 1.  <span style="font-size:18px;">#include<iostream> #inc

C++ 對陣列的遍歷

#include <iostream> #include <string> using namespace std; int main() { int ia[3][4