如何在某個c 函式裡輸入大小待定的二維陣列

2022-02-20 13:44:32 字數 4669 閱讀 2145

1樓:天蠍神經俠侶

一維陣列是指標,可將二維陣列看作是指標的指標:每一行是一個一維陣列,而列是指向行的指標。在動態建立時,先分配指向行的指標空間,再迴圈維每一行申請空間。

#include

using namespace std;

int main()

//賦值,

k=0;

for(i=0;i

}//顯示剛才的賦值

for(i=0;i

cout << endl;

}//刪除剛才申請的記憶體

for(i=0;i

delete p;

return 0;

今天歸納總結了一下,希望以後的朋友可以少走些彎路:)

一 :關於指標和堆的記憶體分配

先來介紹一下指標 : 指標一種型別,理論上來說它包含其他變數的地址,因此有的書上也叫它:地址變數。

既然指標是一個型別,是型別就有大小,在達內的伺服器上或者普通的pc機上,都是4個位元組大小,裡邊只是儲存了一個變數的地址而已。不管什麼型別的指標,char * ,int * ,int (*) ,string * ,float * ,都是說明了本指標所指向的地址空間是什麼型別而已,瞭解了這個基本上所有的問題都好象都變的合理了。

在c++中,申請和釋放堆中分配的存貯空間,分別使用new和delete的兩個運算子來完成:

指標型別 指標變數名=new 指標型別 (初始化);

delete 指標名;

例如:1、 int *p=new int(0);

它與下列**序列大體等價:

2、int tmp=0, *p=&tmp;

區別:p所指向的變數是由庫操作符new()分配的,位於記憶體的堆區中,並且該物件未命名。

2樓:不知詳解

需要使用動態記憶體分配

目前c++不支援動態陣列

int a,b;

int main()

int func(int arr)

退出程式前要記得delete p;

或者你使用一個類來儲存資料程式可以自動呼叫解構函式.

class array_

array_(int x,int y)

~array_()

int* getp()

int getval(int x,int y)int setval(int x,int y,int val)};int a,b;

int main()

int func(int arr)

int funclass(array_ arr;)

3樓:

設兩個變數,譬如x,y為中間變數,儲存二維陣列的首地址,用指標進行值修改

4樓:匿名使用者

這樣貌似是不可以的~~~

陣列定義的時候下標必須是常量,而且定義後大小就不能變了~~因為在編譯的時候就要為陣列分配規定的記憶體空間了~~~你可以去試試,這樣是不可以的~~~編譯不能通過~~

5樓:匿名使用者

這個要用動態分配

用new.

int a, b;

cin<

int *p

p=new int[a][b];

int func(int *p)

你看看這樣可以不

不過記得要自己釋放分陪的記憶體。

c++中如何輸入一個未知個數的字串陣列或者二維陣列???

6樓:匿名使用者

使用動態陣列。即一個指標指向陣列首地址,一個整型變數表示陣列長度。

陣列所需的空間用new來申請,用完後delete

7樓:匿名使用者

用c++ 的templates:vector,list等

c++中怎麼用new函式定義一個二維陣列?

8樓:問明

假設a,b為兩個int型變數,如果希望這樣生成一個二維陣列:new int[a],是不會得到編譯器允許的——因為沒有指定這個陣列的元素型別。

由於b的大小未知,編譯器無法確定『int』到底是一個什麼型別。所以,要用new建立一個二維陣列。

方法一:使用常量

接上:如果將b指定為一個常量,例如new int[a][5],其實質與new int[a]建立一個動態陣列並無多大區別——只是元素型別由int變為了'int[5]'而已。

示例**:

void testfunc_(unsigned int n)

unsigned int i,j;

//元素型別為『int[5]』的陣列,可賦值給『int[5]』型別的指標.

int(*array2d)[5]=new int[n][5];

for(i=0;ifor(j=0;j<5;++j)

array2d[j]=i*5+j;

//**方法和普通動態陣列相同,使用'delete'即可

deletearray2d;

用這個方法來建立二維陣列,比較直觀、易用,但它最大的限制在於:你必須在編譯時確定b的大小。

方法二:使用指標間接引用

首先建立若干個大小一致的動態陣列,然後將這些陣列的首地址(轉化為指標)按順序儲存到一個動態陣列中,就相當於模擬了一個二維動態陣列。

示例**:

void testfunc_pointer(unsigned int height,unsigned int width)

unsigned int i,j;

//陣列的元素型別為『int*』,可賦值給指向『int*』的指標.

int**array2d=new int*[height];

for(i=0;iarray2d=new int[width];

//訪問.

for(i=0;ifor(j=0;j//記憶體非連續,注意防止越界.

array2d[j]=i*width+j;

//首先**低一級的動態陣列.

for(i=0;ideletearray2d;

//然後**高一級的動態陣列.

deletearray2d;

方法三:使用vector

藉助stl中的vector,我們可以很直觀的建立一個二維陣列,而不需要用到基本陣列的概念。

示例**:

void testfunc_vector(unsigned int height,unsigned int width)

typedef std::vectorintvector;

typedef std::vectorintvector2d;

unsigned int i,j;

intvector2d*parray2d=new intvector2d;

//動態設定大小.

parray2d->resize(height);

for(i=0;i(*parray2d).resize(width);

for(i=0;ifor(j=0;j(*parray2d)[j]=i*width+j;

delete parray2d;

9樓:風若遠去何人留

需要先申請一個m個元素的一維指標空間,然後對每個一維指標上,申請n個元素的物件空間。這樣就可以申請一個m行n列的二維陣列空間了。

以整型為例

const int m = 10, n = 5;//10行5列。

int ** a;

a = new int *[m];

for(int i = 0; i < m; i ++)a[i] = new int[n];

所得到的a就是10行5列的陣列。

使用後需要釋放,**為

for(int i = 0; i < m; i ++)delete  a[i];

delete a;

10樓:雲淡風輕in蘇州

#include

void main()

int i;

//先開第一維空間

p = new int*[m];

for(i = 0; i < m; ++i) }

c++中如何宣告一個二維陣列

11樓:匿名使用者

1、一維陣列: 型別說明符 陣列名[常量表示式]例如 int a[10]它表示陣列名為a,此陣列有10個元素

2、二維陣列: 陣列名[下標][下標]例如 a[2][3] 下標可以是整形表示式如a[2-1][2*2-1]不能寫成a[2,3]

a[2-1,2*2-1]

12樓:

int a[m][n];

這代表了一個m行n列的二位陣列。

或者是int **p;

用指標定義一個二位陣列。

還有int (*p)[n];

這定義了一個未知行n列的二位陣列。

希望能幫到你。

祝好運。

13樓:相思丶貓

簡單啊,比如

int a[5][3]; 5行3列的int陣列

14樓:

陣列型別 陣列名 [行數][列數];

int a [3] [5] ;同上

如何在ecel的if函式中輸入包含選項

if iserror find 東芝 a2,1 a2 如果在a2單元格找不到 東芝 兩字 出錯 就置空,如果找到,就返回結果a2 if如果 iserror出錯 find查詢 只要前兩個字直接用 如你的資料在a列 left a1,2 公式下拉就行了 如果你只要顯示東芝的,那麼 if left a1,2...

C如何在textbox輸入完成之後,按回車相當於點選了button按鈕

你可以把你的截面上的某一個按鈕設定為預設按鈕的。當你在textbox裡面完成內容的輸入之後,按下回車就會自動的幫你執行button按鈕的處理函式的。其實不管你是否是在textbox還是在介面上的任何地方只要是按下回車鍵,就會執行button裡面的處理函式。將form的acceptbutton屬性設定...

c語言如何把某個函式名轉換為字串

根據編譯環境,有如下方式 1 部分編譯器中,支援 function 或 func 巨集。該巨集為編譯器定義,值為被呼叫函式的函式名轉換成的字串。如在func 中呼叫 function 則該巨集的值為 func 2 如果編譯器不支援上述巨集名,那麼需要手動新增巨集。可以有如下兩種方式 a.直接定義對應...