二維字串陣列的初始化-動態記憶體分配
昨天在用fbs200 指紋採集晶元採集到乙個二維陣列資料後,利用串列埠傳輸上來的資料是以十六進製制的資料格式表示的二維矩陣,比如「ff」 、「bd」 、「5c 」等等這樣的形式,而對於一幅灰度影象,一般都是在0 ~255 之間的資料來表示其亮度值,因此想通過二維字串陣列來對採集過來的資料進行轉化顯示。 但在動態分配乙個
char **str
;str
=new char*[128]
;之後對其進行初始化時,總是出現錯誤,不知道如何才能很好的對其賦值,還得深入學習一下。
其實對乙個字元的轉化很容易,但對乙個字串形式的字元來轉化,而且是對乙個多維陣列來轉化就有點吃力了。首先建立乙個多維字串陣列,這裡是二維的字串陣列,程式如下所示:
#i nclude "stdio.h"
void main()
;//初始化乙個二維字串陣列
char *str;//
定義乙個一維字串變數
int a,b;
int i,j;
int result1;
for (i=0;i<2;i++)
else if (str[0]>='a' && str[1]<'a')
else if (str[0]<'a' && str[1]>='a')
else
printf("a=%d/n",a);
printf("b=%d/n",b);
printf("%d/n",result1); }
} }這裡只是用2 ×2 的字串陣列做了乙個實驗,一幅影象都是比較大的,這樣在對陣列初始化時會占用很多的記憶體,這樣有時會造成編譯無法通過,昨天就很有幾次宕機,當時只是用到64 ×64 的陣列。後來把陣列的初始化放到main 的外面,作為全域性變數,在棧中靜態的分配一塊記憶體空間,雖然可行,但也很佔記憶體,於是想到了在函式中動態分配記憶體,對動態分配記憶體又重新學習了一遍,不了解的可以和我一起學習一下。
動態記憶體分配
1.堆記憶體分配:
c/c++
定義了4 個記憶體區間:**區,全域性變數與靜態變數區,區域性變數區即棧區,動態儲存區,即堆(heap )區或自由儲存區(free store )。
堆的概念:
通常定義變數(或物件),編譯器在編譯時都可以根據該變數(或物件)的型別知道所需記憶體空間的大小,從而系統在適當的時候為他們分配確定的儲存空間。這種記憶體分配稱為靜態儲存分配;
有些操作物件只在程式執行時才能確定,這樣編譯時就無法為他們預定儲存空間,只能在程式執行時,系統根據執行時的要求進行記憶體分配,這種方法稱為動態儲存分配。所有動態儲存分配都在堆區中進行。
當程式執行到需要乙個動態分配的變數或物件時,必須向系統申請取得堆中的一塊所需大小的存貯空間,用於存貯該變數或物件。當不再使用該變數或物件時,也就是它的生命結束時,要顯式釋放它所占用的存貯空間,這樣系統就能對該堆空間進行再次分配,做到重複使用有限的資源。
2.堆記憶體的分配與釋放
堆空間申請、釋放的方法:
在c++ 中,申請和釋放堆中分配的存貯空間,分別使用new 和delete 的兩個運算子來完成: 指標變數名=new 型別名( 初始化式) ;
delete
指標名;
例如:1 、 int *pi=new int(0);
它與下列**序列大體等價: 2
、int ival=0, *pi=&ival;
區別:pi 所指向的變數是由庫操作符new() 分配的,位於程式的堆區中,並且該物件未命名。
堆空間申請、釋放說明:
⑴.new 運算子返回的是乙個指向所分配型別變數(物件)的指標。對所建立的變數或物件,都是通過該指標來間接操作的,而且動態建立的物件本身沒有名字。
⑵. 一般定義變數和物件時要用識別符號命名,稱命名物件,而動態的稱無名物件( 請注意與棧區中的臨時物件的區別,兩者完全不同:生命期不同,操作方法不同,臨時變數對程式設計師是透明的) 。
⑶. 堆區是不會在分配時做自動初始化的(包括清零),所以必須用初始化式(initializer) 來顯式初始化。new 表示式的操作序列如下:從堆區分配物件,然後用括號中的值初始化該物件。 3.
堆空間申請、釋放演示:
⑴. 用初始化式(initializer) 來顯式初始化
int *pi=new int(0);
⑵. 當pi 生命週期結束時,必須釋放pi 所指向的目標:
delete pi;
注意這時釋放了pi 所指的目標的記憶體空間,也就是撤銷了該目標,稱動態記憶體釋放(dynamic memory deallocation ),但指標pi 本身並沒有撤銷,它自己仍然存在,該指標所佔記憶體空間並未釋放。
下面是關於new 操作的說明
⑴.new 運算子返回的是乙個指向所分配型別變數(物件)的指標。對所建立的變數或物件,都是通過該指標來間接操作的,而動態建立的物件本身沒有名字。
⑵. 一般定義變數和物件時要用識別符號命名,稱命名物件,而動態的稱無名物件( 請注意與棧區中的臨時物件的區別,兩者完全不同:生命期不同,操作方法不同,臨時變數對程式設計師是透明的) 。
⑶. 堆區是不會在分配時做自動初始化的(包括清零),所以必須用初始化式(initializer) 來顯式初始化。new 表示式的操作序列如下:從堆區分配物件,然後用括號中的值初始化該物件。
4. 在堆中建立動態一維陣列
①申請陣列空間:
指標變數名=new 型別名[ 下標表示式];
注意:「 下標表示式」 不是常量表示式,即它的值不必在編譯時確定,可以在執行時確定。
②釋放陣列空間:
delete [ ]
指向該陣列的指標變數名;
注意:方括號非常重要的,如果delete 語句中少了方括號,因編譯器認為該指標是指向陣列第乙個元素的,會產生**不徹底的問題(只**了第乙個元素所佔空間),加了方括號後就轉化為指向陣列的指標,**整個陣列。delete [ ] 的方括號中不需要填陣列元素數,系統自知。即使寫了,編譯器也忽略。
#i nclude
#i nclude
void main()
5. 動態一維陣列的說明
① 變數n 在編譯時沒有確定的值,而是在執行中輸入,按執行時所需分配堆空間,這一點是動態分配的優點,可克服陣列「 大開小用」 的弊端,在表、排序與查詢中的演算法,若用動態陣列,通用性更佳。一定注意:delete pc 是將n 個字元的空間釋放,而用delete pc 則只釋放了乙個字元的空間;
② 如果有乙個char *pc1 ,令pc1=p ,同樣可用delete pc1 來釋放該空間。儘管c++ 不對陣列作邊界檢查,但在堆空間分配時,對陣列分配空間大小是紀錄在案的。
③ 沒有初始化式(initializer ),不可對陣列初始化。
6.指標陣列和陣列指標
指標型別:
(1)int*ptr;//
指標所指向的型別是int
(2)char*ptr;// 指標所指向的的型別是char
(3)int**ptr;// 指標所指向的的型別是int* (也就是乙個int * 型指標)
(4)int(*ptr)[3];// 指標所指向的的型別是int()[3] // 二維指標的宣告
乙個陣列裡存放的都是同乙個型別的指標,通常我們把他叫做指標陣列。
比如 int * a[2]; 它裡邊放了2 個int * 型變數 .
int * a[2]
; a[0]= new int[3];
a[1]=new int[3];
delete a[0];
delete a[1];
注意這裡 是乙個陣列,不能delete ;
陣列指標:
乙個指向一維或者多維陣列的指標.
int * b=new int[10];
指向一維陣列的指標b ;
注意,這個時候釋放空間一定要delete , 否則會造成記憶體洩露, b 就成為了空懸指標
int (*b2)[10]=new int[10][10];
注意,這裡的b2 指向了乙個二維int 型陣列的首位址.
注意:在這裡,b2 等效於二維陣列名,但沒有指出其邊界,即最高維的元素數量,但是它的最低維數的元素數量必須要指定!就像指向字元的指標,即等效乙個字串, 不要把指向字元的指標說成指向字串的指標。
在堆中建立動態多維陣列
new
型別名[ 下標表示式1] [ 下標表示式2]……;
例如:建立乙個動態三維陣列
float (*cp)[30][20] ; //
指向乙個30 行20 列陣列
//的指標,指向二維陣列的指標
cp=new float [15] [30] [20]; //
建立由15 個30*20 陣列組成的陣列;
注意:cp等效於三維陣列名,但沒有指出其邊界,即最高維的元素數量,就像指向字元的指標即等效乙個字串,不要把指向字元的指標,說成指向字串的指標。這與陣列的巢狀定義相一致。
二維陣列的初始化
1.使用兩個for迴圈定義 for i 1 i n i 2.定義時初始化 int a n m 3.使用函式定義 memset 作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法 memset函式對陣列只能用於置零 0 或置負一 1 操作 include voi...
二維陣列的初始化
1.不分行的初始化,所有陣列元素放在一對 內 1 全部元素初始化 a 2 3 2 部分元素初始化 a 2 3 未初始化的元素預設為0,即a 1 1 0,a 1 2 0。3 省略一維長度下標時的初始化 行下標 a 3 陣列元素個數除以列數,正好除盡,所得的商就是行數。a 3 陣列元素個數除以列數,除不...
二維陣列初始化規則
二維陣列初始化的形式為 資料型別 陣列名 整常量表示式 整常量表示式 在中給出各陣列元素的初值,各初值之間用逗號分開。把中的初值依次賦給各陣列元素。有如下幾種初始化方式 分行進行初始化 int a 2 3 在內部再用把各行分開,第一對中的初值1,2,3是0行的3個元素的初值。第二對中的初值4,5,6...