日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言中动态数组的作用,C语言实现动态数组

發(fā)布時(shí)間:2025/4/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中动态数组的作用,C语言实现动态数组 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

在純C語言編程中,數(shù)組的創(chuàng)建必須是固定的大小,因?yàn)镃語言本身沒有提供動(dòng)態(tài)數(shù)組這種數(shù)據(jù)結(jié)構(gòu),這是一個(gè)讓習(xí)慣了使用高級(jí)語言編程的人轉(zhuǎn)做C開發(fā)面臨的一個(gè)很頭疼的問題,本篇文章就將介紹如何使用純C語言編程實(shí)現(xiàn)一個(gè)對(duì)象來作為動(dòng)態(tài)數(shù)組。

閱讀本篇文章前,作者假設(shè)讀者已經(jīng)對(duì)C語言的基礎(chǔ)概念有了一定了解,比如知道什么叫數(shù)組,知道C語言的基礎(chǔ)語法等。如果讀者還對(duì)C語言一無所知,請(qǐng)先對(duì)C語言做一個(gè)了解和入門級(jí)的學(xué)習(xí)之后,再來閱讀本篇文章。

1:C語言中的數(shù)組分析

1.int my_array[100];

如上的代碼,是使用C語言來創(chuàng)建了一個(gè)可以存放100個(gè)整數(shù)的數(shù)組,這個(gè)就是C語言中的數(shù)組。

2.這行代碼一共做了兩件事情:

(1):在棧或者全局?jǐn)?shù)據(jù)區(qū)開辟了內(nèi)存空間(如果是寫在某個(gè)函數(shù)的內(nèi)部,就是在棧上開辟的空間,如果是寫在函數(shù)外面,就是在全局?jǐn)?shù)據(jù)區(qū)上開辟的空間),開辟的內(nèi)存空間大小為100*sizeof(int)個(gè)字節(jié)的內(nèi)存空間。如果是在棧上開辟的,那么這塊內(nèi)存空間會(huì)在走到所在函數(shù)return之后釋放,如果是在全局?jǐn)?shù)據(jù)區(qū),會(huì)隨著進(jìn)程的結(jié)束而釋放。

(2):創(chuàng)建一個(gè)指針指向新開辟的內(nèi)存區(qū)域,并將該區(qū)域的地址賦值給my_array保存,這樣,我們就可以通過下標(biāo)來對(duì)數(shù)組中的成員進(jìn)行訪問,比如:my_array[9]可以訪問第10個(gè)成員。此外,還可以通過取地址指向內(nèi)容的方式來訪問數(shù)組成員,比如*(my_array+10),同樣可以得到和my_array[10]一樣的值。

3.從上面分析int my_array[100];這行代碼可以看出,數(shù)組的操作本質(zhì)上就是內(nèi)存的操作,小標(biāo)的索引只是一種糖衣語法。

4.這種數(shù)組的缺點(diǎn)大家可以很容易想到,數(shù)組開辟的空間大小不根據(jù)實(shí)際數(shù)據(jù)的多少來決定,造成了空間上的浪費(fèi),另外當(dāng)數(shù)據(jù)量大余數(shù)組的最大容量時(shí),會(huì)造成程序的崩潰。

補(bǔ)充:有的朋友也許會(huì)說,按照上面的寫法開辟數(shù)組后,執(zhí)行my_array[100]=1或者my_array[102]=1都不出現(xiàn)崩潰,這個(gè)只是因?yàn)槟愕倪\(yùn)氣好,原因是在my_array指向的內(nèi)存區(qū)域中,第101個(gè)或者第102位置正好有空間而已,因?yàn)槲覀儗憁y_array[100]只能保證有100個(gè)位置是可以使用的,至于100以后的,那就要看系統(tǒng)的“心情”了!

二.定義一個(gè)my_vector結(jié)構(gòu)體

接下來要介紹動(dòng)態(tài)數(shù)組使用到的結(jié)構(gòu)體以及對(duì)應(yīng)的方法聲明。首先創(chuàng)建一個(gè)myVector.h的文件,并編寫如下的代碼:

// my_vector默認(rèn)大小

#define MY_VECTOR_DEF_SIZE 10

// 結(jié)構(gòu)體定義

typedef struct {

int curSize; // 已用的大小

int maxSize; // 數(shù)組最大存儲(chǔ)大小

int *data; // 實(shí)際的數(shù)據(jù)地址

} my_vector;

// 初始化結(jié)構(gòu)體

void InitMyVector(my_vector *vector);

// 追加成員

void AppendMyVector(my_vector *vector, int value);

// 返回指定下標(biāo)中的數(shù)據(jù),如果失敗返回-1

int GetMyVector(my_vector *vector, int index);

// 設(shè)置指定位置的指為指定數(shù)據(jù)

void SetMyVector(my_vector *vector, int index, int value);

// 將當(dāng)前的my_vecotr存儲(chǔ)空間直接擴(kuò)大一倍

void DoubleCapacityMyVector(my_vector *vector);

// 釋放資源

void FreeMyVector(my_vector *vector);

三.實(shí)現(xiàn)定義的my_vector結(jié)構(gòu)體

聲明完成之后要做的就是實(shí)現(xiàn)聲明的函數(shù)了。創(chuàng)建一個(gè)myVector. C的文件,并編寫如下代碼:

#include

#include

#include "myVector.h"

// 初始化

void InitMyVector(my_vector *vector)

{

// 數(shù)據(jù)初始化

vector->curSize = 0;

vector->maxSize = MY_VECTOR_DEF_SIZE;

// 開辟存儲(chǔ)實(shí)際數(shù)據(jù)的空間

vector->data = (int*)malloc(sizeof(int) * vector->maxSize);

}

// 追加值

void AppendMyVector(my_vector *vector, int value)

{

// 空間不夠了需要增大

DoubleCapacityMyVector(vector);

// 添加新的數(shù)據(jù)到數(shù)組尾

vector->data[vector->curSize++] = value;

}

// 獲的值

int GetMyVector(my_vector *vector, int index)

{

// 輸入的數(shù)據(jù)如果小于0或者是大余數(shù)組最大存儲(chǔ)值時(shí),直接退出程序,因?yàn)閿?shù)據(jù)不合法

if (index >= vector->curSize || index < 0) { exit(1); } // 如果輸入的是一個(gè)合法的數(shù)據(jù)那么返回對(duì)應(yīng)的數(shù)據(jù) return vector->data[index];

}

// 設(shè)置值

void SetMyVector(my_vector *vector, int index, int value)

{

// 用0作為默認(rèn)值來他填充數(shù)組

while (index >= vector->curSize)

{

AppendMyVector(vector, 0);

}

vector->data[index] = value;

}

// 擴(kuò)大空間

void DoubleCapacityMyVector(my_vector *vector)

{

if (vector->curSize >= vector->maxSize)

{

// 擴(kuò)大數(shù)組大小為當(dāng)前的兩倍

vector->maxSize *= 2;

vector->data = (int*)realloc(vector->data, sizeof(int) * vector->maxSize);

}

}

//釋放空間

void FreeMyVector(my_vector *vector)

{

free(vector->data);

}

四.使用my_vector結(jié)構(gòu)體創(chuàng)建結(jié)構(gòu)體對(duì)象

創(chuàng)建一個(gè)main.c的文件,并編寫如下代碼

#include

#include "myVector.h"

int main()

{

// 聲明vector對(duì)象

my_vector vector;

int i;

// 初始化vector對(duì)象

InitMyVector(&vector);

// 隨便初始化點(diǎn)數(shù)據(jù)

for (i = 0; i <200; i++)

{

AppendMyVector(&vector, i);

}

// 測(cè)試用,在第200位置設(shè)置1,200之前的數(shù)據(jù)如果為空自動(dòng)填充為0,當(dāng)前程序就是200-299為0

SetMyVector(&vector, 300, 1);

// 測(cè)試用,取指定位置的數(shù)據(jù)

printf("%d\n", GetMyVector(&vector, 6));

// 測(cè)試用,輸出每一個(gè)成員

for (i = 0; i < vector.curSize; i++)

{

printf("%d %d\n", i, GetMyVector(&vector, i));

}

// 使用完之后要釋放,不然會(huì)有內(nèi)存泄露

FreeMyVector(&vector);

return 0;

}

到此為止,我們已經(jīng)實(shí)現(xiàn)了用C語言去創(chuàng)建動(dòng)態(tài)數(shù)組,其實(shí)動(dòng)態(tài)數(shù)組的本質(zhì)也是靜態(tài)的,只不過空間的增加我們做了一些手動(dòng)的處理而已。

類似的,刪除指定位置的數(shù)據(jù)也可以用上面的方式去實(shí)現(xiàn)。請(qǐng)大家自己理解學(xué)習(xí)嘗試進(jìn)行實(shí)現(xiàn)!

C語言網(wǎng), 版權(quán)所有丨如未注明 , 均為原創(chuàng)丨本網(wǎng)站采用BY-NC-SA協(xié)議進(jìn)行授權(quán) , 轉(zhuǎn)載請(qǐng)注明C語言實(shí)現(xiàn)動(dòng)態(tài)數(shù)組!

總結(jié)

以上是生活随笔為你收集整理的C语言中动态数组的作用,C语言实现动态数组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。