最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言 動(dòng)態(tài)分配數(shù)組案例詳解

 更新時(shí)間:2021年08月18日 09:01:21   作者:吉大秦少游  
這篇文章主要介紹了C語言 動(dòng)態(tài)分配數(shù)組案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

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

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

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

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

#include <stdio.h>
#include <stdlib.h>
int main()
{
int n1,i;
int *array;
printf("請(qǐng)輸入所要?jiǎng)?chuàng)建的一維動(dò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;
}

運(yùn)行結(jié)果為:

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

#include <iostream>
#include <stdlib.h>
using namespace std;
 
int main(){
	int num1,num2;
	cout<<"請(qǐng)輸入動(dòng)態(tài)二維數(shù)組的第一個(gè)維度:";
	cin>>num1;
	cout<<"請(qǐng)輸入動(dòng)態(tài)二維數(shù)組的第二個(gè)維度:";
	cin>>num2;
	int **array = (int **)calloc(num1,sizeof(int));
	for(int i=0;i<num1;i++) {
		array[i] = (int*)calloc(num2,sizeof(int));
	}
	for(int i=0;i<num1;i++){
		for(int j=0;j<num2;j++){
			array[i][j] =i*num2+j+1;
			printf("%d\t",array[i][j]);
		}
		cout<<endl;
	}
	for(int i=0;i<num1;i++)	free(array[i]);
	free(array);
	return 0;
}

運(yùn)行結(jié)果為:

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

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

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

以上是我們創(chuàng)建二維動(dòng)態(tài)數(shù)組的最外層,創(chuàng)建好了最外層那么我們接下來就是要?jiǎng)?chuàng)建次外層了。這里使用了二級(jí)指針。

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

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

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

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

在通過以下語句來釋放外層。

free(array);//釋放第一維指針

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

#include <stdlib.h> 
#include <stdio.h> 
int main() 
{ 
int n1,n2,n3; 
int ***array; 
int i,j,k; 
printf("請(qǐng)輸入所要?jiǎng)?chuàng)建的動(dòng)態(tài)數(shù)組的第一維長度:");
scanf("%d",&n1); 
printf("請(qǐng)輸入所要?jiǎng)?chuàng)建的動(dòng)態(tài)數(shù)組的第二維長度:");
scanf("%d",&n2); 
printf("請(qǐng)輸入所要?jiǎng)?chuàng)建的動(dò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; 
}

運(yùn)行結(jié)果為:

請(qǐng)輸入所要?jiǎng)?chuàng)建的動(dòng)態(tài)數(shù)組的第一維長度:3
請(qǐng)輸入所要?jiǎng)?chuàng)建的動(dòng)態(tài)數(shù)組的第二維長度:3
請(qǐng)輸入所要?jiǎng)?chuàng)建的動(dò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

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

#include <stdio.h>
#include <stdlib.h>
int main()
{
int*n,*p;
int i,n1,n2;
printf("請(qǐng)輸入所要?jiǎng)?chuàng)建的動(dòng)態(tài)數(shù)組的長度:");
scanf("%d",&n1); 
n=(int*)calloc(n1,sizeof(int));
printf("請(qǐng)輸入所要擴(kuò)展的動(dòng)態(tài)數(shù)組的長度:");
scanf("%d",&n2); 
p=(int*)realloc(n,(n2)*sizeof(int));//動(dòng)態(tài)擴(kuò)充數(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;
}

運(yùn)行結(jié)果如下:

請(qǐng)輸入所要?jiǎng)?chuàng)建的動(dòng)態(tài)數(shù)組的長度:6
請(qǐng)輸入所要擴(kuò)展的動(dò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      Press any key to continue

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

#include <stdio.h>
#include <stdlib.h>
int main()
{
int*n,*p;
int i,n1,n2;
printf("請(qǐng)輸入所要?jiǎng)?chuàng)建的動(dò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請(qǐng)輸入所要縮小的動(dòng)態(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;
}

運(yùn)行結(jié)果為:

請(qǐng)輸入所要?jiǎng)?chuàng)建的動(dò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
請(qǐng)輸入所要縮小的動(dòng)態(tài)數(shù)組的長度:15

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

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

到此這篇關(guān)于C語言 動(dòng)態(tài)分配數(shù)組案例詳解的文章就介紹到這了,更多相關(guān)C語言 動(dòng)態(tài)分配數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)通訊錄系統(tǒng)程序

    C語言實(shí)現(xiàn)通訊錄系統(tǒng)程序

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)通訊錄系統(tǒng)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 基于Matlab實(shí)現(xiàn)繪制3D足球的示例代碼

    基于Matlab實(shí)現(xiàn)繪制3D足球的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Matlab實(shí)現(xiàn)繪制3D足球,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下
    2022-11-11
  • C/C++實(shí)現(xiàn)圖形學(xué)掃描線填充算法

    C/C++實(shí)現(xiàn)圖形學(xué)掃描線填充算法

    這篇文章主要介紹了C/C++實(shí)現(xiàn)圖形學(xué)掃描線填充算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++11 并發(fā)指南之std::mutex詳解

    C++11 并發(fā)指南之std::mutex詳解

    這篇文章主要介紹了C++11 并發(fā)指南之std::mutex詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 解析四則表達(dá)式的編譯過程及生成匯編代碼

    解析四則表達(dá)式的編譯過程及生成匯編代碼

    本篇文章是對(duì)四則表達(dá)式的編譯過程及生成匯編代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表的實(shí)現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表的實(shí)現(xiàn)

    鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將用C語言實(shí)現(xiàn)單鏈表,需要的可以參考一下
    2022-06-06
  • C++中vector的模擬實(shí)現(xiàn)實(shí)例詳解

    C++中vector的模擬實(shí)現(xiàn)實(shí)例詳解

    vector是表示可變大小數(shù)組的序列容器,它也采用連續(xù)存儲(chǔ)空間來存儲(chǔ)元素,因此可以采用下標(biāo)對(duì)vector的元素進(jìn)行訪問,這篇文章主要給大家介紹了關(guān)于C++中vector模擬實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 詳解C++標(biāo)準(zhǔn)庫中處理正則表達(dá)式的類std::regex

    詳解C++標(biāo)準(zhǔn)庫中處理正則表達(dá)式的類std::regex

    std?是?C++?標(biāo)準(zhǔn)庫的命名空間,包含了大量標(biāo)準(zhǔn)的?C++?類、函數(shù)和對(duì)象,這些類和函數(shù)提供了廣泛的功能,包括輸入輸出、容器、算法、字符串處理等,這篇文章主要介紹了C++標(biāo)準(zhǔn)庫中提供的用于處理正則表達(dá)式的類std::regex,需要的朋友可以參考下
    2024-03-03
  • linux c 查找使用庫的cflags與libs的方法詳解

    linux c 查找使用庫的cflags與libs的方法詳解

    本篇文章是對(duì)在linux中使用c語言查找使用庫的cflags與libs的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中的RAII機(jī)制詳解

    C++中的RAII機(jī)制詳解

    這篇文章主要介紹了C++中的RAII機(jī)制詳解,RAII是Resource Acquisition Is Initialization的簡稱,是C++語言的一種管理資源、避免泄漏的慣用法,需要的朋友可以參考下
    2014-09-09

最新評(píng)論

祁阳县| 射洪县| 新邵县| 揭阳市| 南阳市| 灯塔市| 上蔡县| 洛扎县| 綦江县| 荃湾区| 克东县| 沙坪坝区| 壤塘县| 全椒县| 北辰区| 沙河市| 溧水县| 凉城县| 隆德县| 双江| 榕江县| 屏山县| 武穴市| 凭祥市| 广宁县| 抚松县| 陆川县| 巍山| 沙雅县| 招远市| 响水县| 新巴尔虎左旗| 巨鹿县| 平南县| 锦屏县| 定南县| 郧西县| 陵川县| 淅川县| 宁夏| 东宁县|