日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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

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

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

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

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

?

例子:

C語(yǔ)言:

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

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

?? //動(dòng)態(tài)分配m_iWidth個(gè)類型為int的內(nèi)存空間
//分配的是某行的數(shù)值空間
}
//由此分配的二維數(shù)組空間并非是連續(xù)的
//可以使用m_ppTable[row][col]來(lái)給該二維數(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í)候就和普通的二維數(shù)組一樣
最后用
for(i=0;i?? cfree(a[i]);
cfree(a);釋放內(nèi)存
就可以了
?????? (2)、int *Ptr[ 5 ]
?????? 這樣定義的話,編譯器已經(jīng)為它分配了 5 個(gè)指針的空間,這相當(dāng)于(1)中的第一次內(nèi)存分配。根據(jù)對(duì)(1)的討論可知,顯然要對(duì)其進(jìn)行一次內(nèi)存分配的。否則就是"野"指針。
?????? (3)、int ( *Ptr )[ 5 ]
?????? 這種定義我覺(jué)得很費(fèi)解,不是不懂,而是覺(jué)得理解起來(lái)特別吃力,也許是我不太習(xí)慣這樣的定義吧。怎么描述它呢?它的意義是"一群" 指針,每個(gè)指針都是指向一個(gè) 5 個(gè)整數(shù)的數(shù)組。

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

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

?

_______________________________________________________________

1. C語(yǔ)言動(dòng)態(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);//分配每個(gè)指針?biāo)赶虻臄?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++動(dòng)態(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];//分配每個(gè)指針?biāo)赶虻臄?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;//分配每個(gè)指針?biāo)赶虻臄?shù)組
}
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//4,指針
delete[] a[0];
delete[] a;

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

?


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

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

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


1. C語(yǔ)言動(dòng)態(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);//分配每個(gè)指針?biāo)赶虻臄?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++動(dòng)態(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];//分配每個(gè)指針?biāo)赶虻臄?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;//分配每個(gè)指針?biāo)赶虻臄?shù)組
}
printf("%dn", sizeof(a));//4,指針
printf("%dn", sizeof(a[0]));//4,指針
delete[] a[0];
delete[] a;
多說(shuō)一句:new和delete要注意配對(duì)使用,即有多少個(gè)new就有多少個(gè)delete,這樣才可以避免內(nèi)存泄漏!


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



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

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

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

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

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

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

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

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

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

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

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

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

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

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

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

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

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

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

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

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

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