www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > > 充電吧
[導讀]二維數(shù)組定義以及動態(tài)分配空間下面三種定義形式怎么理解?怎么動態(tài)分配空間? (1)、int **Ptr; (2)、int *Ptr[ 5 ]; 我更喜歡寫成 int* Prt[5]; (3)、int (

二維數(shù)組定義以及動態(tài)分配空間

下面三種定義形式怎么理解?怎么動態(tài)分配空間?
(1)、int **Ptr;
(2)、int *Ptr[ 5 ]; 我更喜歡寫成 int* Prt[5];
(3)、int ( *Ptr )[ 5 ];

此文引自網(wǎng)上,出處不詳,但是覺得非常好。略改了一點。

多維數(shù)組一向很難,一般都采用一維數(shù)組,但是一旦要用到還真是頭疼。 閑話少說,這里我就以三個二維數(shù)組的比較來展開討論:
(1)、int **Ptr;
(2)、int *Ptr[ 5 ]; 我更喜歡寫成 int* Prt[5];
(3)、int ( *Ptr )[ 5 ];
以上三例都是整數(shù)的二維數(shù)組,都可以用形如 Ptr[ 1 ][ 1 ] 的 方式訪問其內(nèi)容;但它們的差別卻是很大的。下面我從四個方面對它們進行討論:
???? 一、內(nèi)容:
??????? 它們本身都是指針,它們的最終內(nèi)容都是整數(shù)。注意我這里說的是最終內(nèi)容,而不是中間內(nèi)容,比如你寫 Ptr[ 0 ],對于三者來說,其內(nèi)容都是一個整數(shù)指針,即 int *;Ptr[1][1] 這樣的形式才是其最終內(nèi)容。
???? 二、意義:
??????? (1)、int **Ptr 表示指向"一群"指向整數(shù)的指針的指針。
??????? (2)、int *Ptr[ 5 ] 表示指向 5 個指向整數(shù)的指針的指針,或者說Ptr有5個指向"一群"整數(shù)的指針,Ptr是這5個指針構(gòu)成的數(shù)組的地址。
??????? (3)、int ( *Ptr )[ 5 ] 表示指向"一群"指向 5 個整數(shù)數(shù)組的指針的指針。
???? 三、所占空間:
??????? (1)、int **Ptr 和 (3)、int ( *Ptr )[ 5 ] 一樣,在32位平臺里,都是4字節(jié),即一個指針。
??????? 但 (2)、int *Ptr[ 5 ] 不同,它是 5 個指針,它占5 * 4 = 20 個字節(jié)的內(nèi)存空間。
???? 四、用法:
??????? (1)、int **Ptr
??????? 因為是指針的指針,需要兩次內(nèi)存分配才能使用其最終內(nèi)容。首 先,Ptr = ( int ** )new int *[ 5 ];這樣分配好了以后,它和(2)的意義相同了;然后要分別對 5 個指針進行內(nèi)存分配,例如:
?? Ptr[ 0 ] = new int[ 20 ];?

  它表示為第 0 個指針分配 20 個整數(shù),分配好以后, Ptr[ 0 ] 為指向20個整數(shù)的數(shù)組。這時可以使用下標用法 Ptr[ 0 ][ 0 ] 到Ptr[ 0 ][ 19 ] 了。
?????? 如果沒有第一次內(nèi)存分配,該 Ptr 是個"野"指針,是不能使用的,如果沒有第二次內(nèi)存分配,則 Ptr[ 0 ] 等也是個"野"指針,也是不能用的。當然,用它指向某個已經(jīng)定義的地址則是允許的,那是另外的用法(類似于"借雞生蛋"的做法),這里不作討論(下同)。

?

例子:

C語言:

//動態(tài)分配二維數(shù)組空間
{
?? m_iHight=10;//二維數(shù)組的高度
 m_i;//二維數(shù)組的寬度
//動態(tài)分配一個二維數(shù)組m_ppTable內(nèi)存空間
//其類型為int
?? //m_ppTable指向該數(shù)組
?? int **m_ppTable;
?? m_ppTable=new int *[m_iHight];

//動態(tài)分配m_iHight個類型為int *的內(nèi)存空間
//分配的是行地址空間
?? for(int i=0;i
??????????? m_ppTable[i]= new int[m_iWidth];

?? //動態(tài)分配m_iWidth個類型為int的內(nèi)存空間
//分配的是某行的數(shù)值空間
}
//由此分配的二維數(shù)組空間并非是連續(xù)的
//可以使用m_ppTable[row][col]來給該二維數(shù)組賦值
//其中 0<=row
//釋放所分配的內(nèi)存空間
{
??? for(int i=0;i
?????? delete[m_iWidth]m_ppTable[i]; //以行為單位釋放數(shù)值空間
??? delete [m_iHight]m_ppTable;????? //釋放行地址空間
}

int **a;
a=(int **)calloc(sizeof(int *),n);
for (i=0;i?? a[i]=(int *)calloc(sizeof(int),n);
這樣就可以了
使用的時候就和普通的二維數(shù)組一樣
最后用
for(i=0;i?? cfree(a[i]);
cfree(a);釋放內(nèi)存
就可以了
?????? (2)、int *Ptr[ 5 ]
?????? 這樣定義的話,編譯器已經(jīng)為它分配了 5 個指針的空間,這相當于(1)中的第一次內(nèi)存分配。根據(jù)對(1)的討論可知,顯然要對其進行一次內(nèi)存分配的。否則就是"野"指針。
?????? (3)、int ( *Ptr )[ 5 ]
?????? 這種定義我覺得很費解,不是不懂,而是覺得理解起來特別吃力,也許是我不太習慣這樣的定義吧。怎么描述它呢?它的意義是"一群" 指針,每個指針都是指向一個 5 個整數(shù)的數(shù)組。

  如果想分配 k 個指針,這樣寫: Ptr = ( int ( * )[ 5 ] ) new int[ 5 * k ]。

  這是一次性的內(nèi)存分配。分配好以后,Ptr 指向一片連續(xù)的地址空間,
  其中 Ptr[ 0 ] 指向第 0 個 5 個整數(shù)數(shù)組的首地址,Ptr[ 1 ] 指向第1個5個整數(shù)數(shù)組的首地址。
??? 綜上所述,我覺得可以這樣理解它們:
??? int ** Ptr

?

_______________________________________________________________

1. C語言動態(tài)分配二維數(shù)組
(1)已知第二維
Code-1
char (*a)[N];//指向數(shù)組的指針
a = (char (*)[N])malloc(sizeof(char *) * m);
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//N,一維數(shù)組
free(a);

(2)已知第一維
Code-2
char* a[M];//指針的數(shù)組
int i;
for(i=0; i<M; i++)
a[i] = (char *)malloc(sizeof(char) * n);
printf("%dn", sizeof(a));//4*M,指針數(shù)組
printf("%dn", sizeof(a[0]));//4,指針
for(i=0; i<M; i++)
?? free(a[i]);

(3)已知第一維,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)
Code-3
char* a[M];//指針的數(shù)組
int i;
a[0] = (char *)malloc(sizeof(char) * M * n);
for(i=1; i<M; i++)
a[i] = a[i-1] + n;
printf("%dn", sizeof(a));//4*M,指針數(shù)組
printf("%dn", sizeof(a[0]));//4,指針
free(a[0]);

(4)兩維都未知
Code-4
char **a;
int i;
a = (char **)malloc(sizeof(char *) * m);//分配指針數(shù)組
for(i=0; i<m; i++)
{
a[i] = (char *)malloc(sizeof(char) * n);//分配每個指針所指向的數(shù)組
}
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//4,指針
for(i=0; i<m; i++)
{
free(a[i]);
}
free(a);

(5)兩維都未知,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)
Code-5
char **a;
int i;
a = (char **)malloc(sizeof(char *) * m);//分配指針數(shù)組
a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空間
for(i=1; i<m; i++)
{
a[i] = a[i-1] + n;
}
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//4,指針
free(a[0]);
free(a);

2.C++動態(tài)分配二維數(shù)組
(1)已知第二維
Code-6
char (*a)[N];//指向數(shù)組的指針
a = new char[m][N];
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//N,一維數(shù)組
delete[] a;

(2)已知第一維
Code-7
char* a[M];//指針的數(shù)組
for(int i=0; i<M; i++)
?? a[i] = new char[n];
printf("%dn", sizeof(a));//4*M,指針數(shù)組
printf("%dn", sizeof(a[0]));//4,指針
for(i=0; i<M; i++)
?? delete[] a[i];

(3)已知第一維,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)
Code-8
char* a[M];//指針的數(shù)組
a[0] = new char[M*n];
for(int i=1; i<M; i++)
a[i] = a[i-1] + n;
printf("%dn", sizeof(a));//4*M,指針數(shù)組
printf("%dn", sizeof(a[0]));//4,指針
delete[] a[0];

(4)兩維都未知
Code-9
char **a;
a = new char* [m];//分配指針數(shù)組
for(int i=0; i<m; i++)
{
a[i] = new char[n];//分配每個指針所指向的數(shù)組
}
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//4,指針
for(i=0; i<m; i++)
delete[] a[i];
delete[] a;

(5)兩維都未知,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)
Code-10
char **a;
a = new char* [m];
a[0] = new char[m * n];//一次性分配所有空間
for(int i=1; i<m; i++)
{
a[i] = a[i-1] + n;//分配每個指針所指向的數(shù)組
}
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//4,指針
delete[] a[0];
delete[] a;

多說一句:new和delete要注意配對使用,即有多少個new就有多少個delete,這樣才可以避免內(nèi)存泄漏!

?


3.靜態(tài)二維數(shù)組作為函數(shù)參數(shù)傳遞
如果采用上述幾種方法動態(tài)分配二維數(shù)組,那么將對應的數(shù)據(jù)類型作為函數(shù)參數(shù)就可以了。這里討論靜態(tài)二維數(shù)組作為函數(shù)參數(shù)傳遞,即按照以下的調(diào)用方式:
int a[2][3];
func(a);
C語言中將靜態(tài)二維數(shù)組作為參數(shù)傳遞比較麻煩,一般需要指明第二維的長度,如果不給定第二維長度,則只能先將其作為一維指針傳遞,然后利用二維數(shù)組的線性存儲特性,在函數(shù)體內(nèi)轉(zhuǎn)化為對指定元素的訪問。
首先寫好測試代碼,以驗證參數(shù)傳遞的正確性:
(1)給定第二維長度
Code-11
void func(int a[][N])
{
printf("%dn", a[1][2]);
}

(2)不給定第二維長度
Code-12
void func(int* a)
{
printf("%dn", a[1 * N + 2]);//計算元素位置
}

注意:使用該函數(shù)時需要將二維數(shù)組首地址強制轉(zhuǎn)換為一維指針,即func((int*)a);


1. C語言動態(tài)分配二維數(shù)組
(1)已知第二維
Code-1
char (*a)[N];//指向數(shù)組的指針
a = (char (*)[N])malloc(sizeof(char *) * m);
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//N,一維數(shù)組
free(a);
(2)已知第一維
Code-2
char* a[M];//指針的數(shù)組
int i;
for(i=0; i<M; i++)
a[i] = (char *)malloc(sizeof(char) * n);
printf("%dn", sizeof(a));//4*M,指針數(shù)組
printf("%dn", sizeof(a[0]));//4,指針
for(i=0; i<M; i++)
?? free(a[i]);
(3)已知第一維,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)
Code-3
char* a[M];//指針的數(shù)組
int i;
a[0] = (char *)malloc(sizeof(char) * M * n);
for(i=1; i<M; i++)
a[i] = a[i-1] + n;
printf("%dn", sizeof(a));//4*M,指針數(shù)組
printf("%dn", sizeof(a[0]));//4,指針
free(a[0]);
(4)兩維都未知
Code-4
char **a;
int i;
a = (char **)malloc(sizeof(char *) * m);//分配指針數(shù)組
for(i=0; i<m; i++)
{
a[i] = (char *)malloc(sizeof(char) * n);//分配每個指針所指向的數(shù)組
}
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//4,指針
for(i=0; i<m; i++)
{
free(a[i]);
}
free(a);
(5)兩維都未知,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)
Code-5
char **a;
int i;
a = (char **)malloc(sizeof(char *) * m);//分配指針數(shù)組
a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空間
for(i=1; i<m; i++)
{
a[i] = a[i-1] + n;
}
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//4,指針
free(a[0]);
free(a);


2.C++動態(tài)分配二維數(shù)組
(1)已知第二維
Code-6
char (*a)[N];//指向數(shù)組的指針
a = new char[m][N];
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//N,一維數(shù)組
delete[] a;
(2)已知第一維
Code-7
char* a[M];//指針的數(shù)組
for(int i=0; i<M; i++)
?? a[i] = new char[n];
printf("%dn", sizeof(a));//4*M,指針數(shù)組
printf("%dn", sizeof(a[0]));//4,指針
for(i=0; i<M; i++)
?? delete[] a[i];
(3)已知第一維,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)
Code-8
char* a[M];//指針的數(shù)組
a[0] = new char[M*n];
for(int i=1; i<M; i++)
a[i] = a[i-1] + n;
printf("%dn", sizeof(a));//4*M,指針數(shù)組
printf("%dn", sizeof(a[0]));//4,指針
delete[] a[0];
(4)兩維都未知
Code-9
char **a;
a = new char* [m];//分配指針數(shù)組
for(int i=0; i<m; i++)
{
a[i] = new char[n];//分配每個指針所指向的數(shù)組
}
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//4,指針
for(i=0; i<m; i++)
delete[] a[i];
delete[] a;
(5)兩維都未知,一次分配內(nèi)存(保證內(nèi)存的連續(xù)性)
Code-10
char **a;
a = new char* [m];
a[0] = new char[m * n];//一次性分配所有空間
for(int i=1; i<m; i++)
{
a[i] = a[i-1] + n;//分配每個指針所指向的數(shù)組
}
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//4,指針
delete[] a[0];
delete[] a;
多說一句:new和delete要注意配對使用,即有多少個new就有多少個delete,這樣才可以避免內(nèi)存泄漏!


3.靜態(tài)二維數(shù)組作為函數(shù)參數(shù)傳遞
如果采用上述幾種方法動態(tài)分配二維數(shù)組,那么將對應的數(shù)據(jù)類型作為函數(shù)參數(shù)就可以了。這里討論靜態(tài)二維數(shù)組作為函數(shù)參數(shù)傳遞,即按照以下的調(diào)用方式:
int a[2][3];
func(a);
C語言中將靜態(tài)二維數(shù)組作為參數(shù)傳遞比較麻煩,一般需要指明第二維的長度,如果不給定第二維長度,則只能先將其作為一維指針傳遞,然后利用二維數(shù)組的線性存儲特性,在函數(shù)體內(nèi)轉(zhuǎn)化為對指定元素的訪問。
首先寫好測試代碼,以驗證參數(shù)傳遞的正確性:
(1)給定第二維長度
Code-11
void func(int a[][N])
{
printf("%dn", a[1][2]);
}
(2)不給定第二維長度
Code-12
void func(int* a)
{
printf("%dn", a[1 * N + 2]);//計算元素位置
}
注意:使用該函數(shù)時需要將二維數(shù)組首地址強制轉(zhuǎn)換為一維指針,即func((int*)a);



本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉