久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C語言的那些小秘密之動態(tài)數(shù)組

 qdhtxxlhz 2011-08-01

C語言的那些小秘密之動態(tài)數(shù)組

分類: 【C語言的那些小秘密】 4179人閱讀 評論(49) 收藏 舉報

摘要的重要性是不言而喻的,每次發(fā)文章我都很糾結(jié)如何寫出一個有特色的摘要來,能夠以最為簡短的文字向讀者描述出我所要表達的東西。但是常常出現(xiàn)的問題是,,摘要寫得太簡短了,讀者看了不清楚文章究竟要講啥,;摘要寫得稍微長點的話自然能夠描述清楚所要表達的東西,,但是卻也出現(xiàn)了另外一個問題,就是讀者看到大段的文字描述,,覺得枯燥無味,,直接二話不說給文章判了個“死刑”,導(dǎo)致這種情況下愿意真正的花時間看完摘要的讀者屈指可數(shù),更不用說文章的正文部分了,,所以時長感慨寫文章最頭疼的莫過于摘要了,。

很多人在編寫C語言代碼的時候很少使用動態(tài)數(shù)組,不管什么情況下通通使用靜態(tài)數(shù)組的方法來解決,,在當初學習C語言的時候我就是一個典型的例子,,但是現(xiàn)在發(fā)現(xiàn)這是一個相當不好的習慣,甚至可能導(dǎo)致編寫的程序出現(xiàn)一些致命的錯誤,。尤其對于搞嵌入式的人來所,,嵌入式系統(tǒng)的內(nèi)存是寶貴的,內(nèi)存是否高效率的使用往往意味著嵌入式設(shè)備是否高質(zhì)量和高性能,,所以高效的使用內(nèi)存對我們來說是很重要的,。那么我們在自己編寫C語言代碼的時候就應(yīng)該學會使用動態(tài)數(shù)組,這也就是我這篇博客要給大家講的,,我盡我所能的用一些簡單的代碼來講解動態(tài)數(shù)組,,希望我所講的對你有所幫助。

那么我們首先來看看什么是動態(tài)數(shù)組,,動態(tài)數(shù)組是相對于靜態(tài)數(shù)組而言,,從“動”字我們也可以看出它的靈活性,靜態(tài)數(shù)組的長度是預(yù)先定義好的,,在整個程序中,,一旦給定大小后就無法改變。而動態(tài)數(shù)組則不然,,它可以隨程序需要而重新指定大小,。動態(tài)數(shù)組的內(nèi)存空間是從堆動態(tài)分配的。是通過執(zhí)行代碼而為其分配存儲空間,。當程序執(zhí)行到我們編寫的分配語句時,,才為其分配。對于靜態(tài)數(shù)組,,其創(chuàng)建非常方便,,使用完也無需釋放,要引用也簡單,,但是創(chuàng)建后無法改變其大小是其致命弱點,!對于動態(tài)數(shù)組,其創(chuàng)建麻煩,,使用完必須由程序員自己釋放,,否則將會引起內(nèi)存泄露。但其使用非常靈活,,能根據(jù)程序需要動態(tài)分配大小,。所以相對于靜態(tài)數(shù)組的來說我們對于使用動態(tài)數(shù)組有很大的自由度。

在創(chuàng)建動態(tài)數(shù)組的過程中我們要遵循一個原則,那就是在創(chuàng)建的時候從外層往里層,,逐層創(chuàng)建,;而釋放的時候從里層往外層,逐層釋放,。這個話你讀了可能理解并不深刻,,不過不要急,接下來我們看看兩段代碼,。

一維動態(tài)數(shù)組的創(chuàng)建:

#include <stdio.h>
#include <stdlib.h>
int main()
{
int n1,i;
int *array;
printf("請輸入所要創(chuàng)建的一維動態(tài)數(shù)組的長度:");
scanf("%d",&n1);
array=(int*)calloc(n1,sizeof(int));
for(i=0;i<n1;i++)
{
 printf("%d\t",array[i]);
}
printf("\n");
for(i=0;i<n1;i++)
{
 array[i]=i+1;
 printf("%d\t",array[i]);
}
 free(array);//釋放第一維指針
return 0;
}

運行結(jié)果為:

特此說明:在以后的運行結(jié)果部分,,我均會附上文字結(jié)果,以防圖片打開失敗,。

請輸入所要創(chuàng)建的一維動態(tài)數(shù)組的長度:4
0       0       0       0
1       2       3       4       Press any key to continue

在此我使用的是calloc()函數(shù)來分配的,,同時也使用兩個for語句來打印數(shù)組元素,我們發(fā)現(xiàn)第一個打印輸出的數(shù)組元素值均為0,,在此也是為了加深讀者對于calloc()函數(shù)的印象我特地使用了它來分配,,如果對于calloc()、malloc(),、realloc()函數(shù)的區(qū)別還是很清楚的讀者可以去看看我的另外一篇博客------C語言的那些小秘密之內(nèi)存分配,。

二維數(shù)組的創(chuàng)建:

#include <stdio.h>
#include <stdlib.h>
int main()
{
int n1,n2;
int **array,i,j;
printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第一維長度:");
scanf("%d",&n1);
printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第二維長度:");
scanf("%d",&n2);
array=(int**)malloc(n1*sizeof(int*)); //第一維
for(i=0;i<n1; i++)
{
array[i]=(int*)malloc(n2* sizeof(int));//第二維
}
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
array[i][j]=i*n2+j+1;
printf("%d\t",array[i][j]);
}
printf("\n");
}
for(i=0;i<n1;i++)
{
free(array[i]);//釋放第二維指針
}
free(array);//釋放第一維指針
return 0;
}

運行結(jié)果為:

 請輸入所要創(chuàng)建的動態(tài)數(shù)組的第一維長度:3
請輸入所要創(chuàng)建的動態(tài)數(shù)組的第二維長度:3
1       2       3
4       5       6
7       8       9
Press any key to continue

有了上面的代碼我們再來說動態(tài)數(shù)組的建立就簡單了,以二維為例,,先說創(chuàng)建,,還記得我們上面說的創(chuàng)建的原則嘛:從外層往里層,,逐層創(chuàng)建,。

array=(int**)malloc(n1*sizeof(int*)); //第一維

以上是我們創(chuàng)建二維動態(tài)數(shù)組的最外層,創(chuàng)建好了最外層那么我們接下來就是要創(chuàng)建次外層了,。

array[i]=(int*)malloc(n2* sizeof(int));//第二維

在創(chuàng)建次外層的過程中我們使用了一個for喜歡語句,,千萬別忘了使用for循環(huán)語句,這是絕大多數(shù)人的一個易錯點,。

創(chuàng)建好了接下來我們該講到釋放了,,而釋放的時候從里層往外層,逐層釋放,。剛剛與我們上面的創(chuàng)建相反,,在以上代碼中我們首先使用了下面一個for循環(huán)來釋放里層。

for(i=0;i<n1;i++)
{
free(array[i]);//釋放第二維指針
}

在通過以下語句來釋放外層,。
free(array);//釋放第一維指針

如果出現(xiàn)多維的情況怎么做呢,,我們接下來再來看看一個三維動態(tài)數(shù)組的創(chuàng)建和釋放,以加深下讀者的印象,。代碼如下:

#include <stdlib.h>
#include <stdio.h>
int main()
{
int n1,n2,n3;
int ***array;
int i,j,k;
printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第一維長度:");
scanf("%d",&n1);
printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第二維長度:");
scanf("%d",&n2);
printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的第三維長度:");
scanf("%d",&n3);
array=(int***)malloc(n1*sizeof(int**));//第一維
for(i=0; i<n1; i++)
{
array[i]=(int**)malloc(n2*sizeof(int*)); //第二維
for(j=0;j<n2;j++)
{
array[i][j]=(int*)malloc(n3*sizeof(int)); //第三維
}
}
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
for(k=0;k<n3;k++)
{
array[i][j][k]=i+j+k+1;
printf("%d\t",array[i][j][k]);
}
printf("\n");
}
printf("\n");
}
for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
free(array[i][j]);//釋放第三維指針
}
}
for(i=0;i<n1;i++)
{
free(array[i]);//釋放第二維指針
}
free(array);//釋放第一維指針
return 0;
}

運行結(jié)果為:


請輸入所要創(chuàng)建的動態(tài)數(shù)組的第一維長度:3
請輸入所要創(chuàng)建的動態(tài)數(shù)組的第二維長度:3
請輸入所要創(chuàng)建的動態(tài)數(shù)組的第三維長度:3
1       2       3
2       3       4
3       4       5

2       3       4
3       4       5
4       5       6

3       4       5
4       5       6
5       6       7

Press any key to continue

看了以上三維動態(tài)數(shù)組的創(chuàng)建和釋放代碼以后,,我想讀者這個時候已經(jīng)可以自己編寫任意維的動態(tài)數(shù)組了。但是細心的讀者可能發(fā)現(xiàn)了一個問題,那就是我們所講的動態(tài)數(shù)組都是一次性創(chuàng)建好的,,如果接下來在使用的過程中我們使用的數(shù)組需要擴展或者刪減一些不再使用元素該怎么辦呢,?!接下來我們先看一段關(guān)于動態(tài)數(shù)組擴展的代碼,,在此以一維動態(tài)數(shù)組的擴展為例,,其它的以此類推。

#include <stdio.h>
#include <stdlib.h>
int main()
{
int*n,*p;
int i,n1,n2;
printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的長度:");
scanf("%d",&n1);
n=(int*)calloc(n1,sizeof(int));
printf("請輸入所要擴展的動態(tài)數(shù)組的長度:");
scanf("%d",&n2);
p=(int*)realloc(n,(n2)*sizeof(int));//動態(tài)擴充數(shù)組
for(i=0;i<n2;i++)
{
p[i]=i+1;
if(i%5==0)
printf("\n");
printf("%d\t",p[i]);
}
free(p);
return 0;
}

運行結(jié)果如下:

請輸入所要創(chuàng)建的動態(tài)數(shù)組的長度:6
請輸入所要擴展的動態(tài)數(shù)組的長度:25

1       2       3       4       5
6       7       8       9       10
11      12      13      14      15
16      17      18      19      20
21      22      23      24      25      Press any key to continue

看了上面的代碼讀者應(yīng)該知道如何來擴展動態(tài)數(shù)組了,,可能有的讀者對于realloc()函數(shù)的使用有些陌生,,如果有什么疑惑的話可以參考我之前寫的一篇博文------C語言的那些小秘密之內(nèi)存分配,在此我就不再做過多的講解了,。

接下來如何縮小動態(tài)數(shù)組,。

#include <stdio.h>
#include <stdlib.h>
int main()
{
int*n,*p;
int i,n1,n2;
printf("請輸入所要創(chuàng)建的動態(tài)數(shù)組的長度:");
scanf("%d",&n1);
n=(int*)calloc(n1,sizeof(int));
for(i=0;i<n1;i++)
{
n[i]=i+1;
if(i%5==0)
printf("\n");
printf("%d\t",n[i]);
}
printf("\n請輸入所要縮小的動態(tài)數(shù)組的長度:");
scanf("%d",&n2);
p=(int*)realloc(n,(n2)*sizeof(int));
for(i=0;i<n2;i++)
{
if(i%5==0)
printf("\n");
printf("%d\t",p[i]);
}
printf("\n");
free(p);
return 0;
}

運行結(jié)果為:

請輸入所要創(chuàng)建的動態(tài)數(shù)組的長度:25

1       2       3       4       5
6       7       8       9       10
11      12      13      14      15
16      17      18      19      20
21      22      23      24      25
請輸入所要縮小的動態(tài)數(shù)組的長度:15

1       2       3       4       5
6       7       8       9       10
11      12      13      14      15
Press any key to continue

在這里值得注意的一點就是在縮減動態(tài)數(shù)組的時候,它是刪除了后面的元素,,而前面的元素保持不變,。在使用realloc()函數(shù)的時候要由其注意它的使用規(guī)則。

講到這兒就到了該說結(jié)束的時候了,,由于本人水平有限,,博客中的不妥或錯誤之處在所難免,殷切希望讀者批評指正,。同時也歡迎讀者共同探討相關(guān)的內(nèi)容,,如果樂意交流的話請留下你寶貴的意見。

分享到:
22

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多