梓益C語言學(xué)習(xí)筆記之鏈表&動態(tài)內(nèi)存&文件
創(chuàng)新互聯(lián)建站憑借專業(yè)的設(shè)計團隊扎實的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識和豐厚的資源優(yōu)勢,提供專業(yè)的網(wǎng)站策劃、做網(wǎng)站、成都網(wǎng)站設(shè)計、網(wǎng)站優(yōu)化、軟件開發(fā)、網(wǎng)站改版等服務(wù),在成都10余年的網(wǎng)站建設(shè)設(shè)計經(jīng)驗,為成都成百上千家中小型企業(yè)策劃設(shè)計了網(wǎng)站。一、定義:
鏈表是一種物理存儲上非連續(xù),通過指針鏈接次序,實現(xiàn)的一種線性存儲結(jié)構(gòu)。
二、特點:
鏈表由一系列節(jié)點(鏈表中每一個元素稱為節(jié)點)組成,節(jié)點在運行時動態(tài)生成(malloc),每個節(jié)點包括兩個部分:
存儲數(shù)據(jù)元素的數(shù)據(jù)域
存儲下一個節(jié)點地址的指針域
如:
typedef struct student
{
int num;
char name[20];
struct student *next;
}STU;
三、動態(tài)內(nèi)存申請
在實際的編程中,有時所需的內(nèi)存空間取決于實際輸入的數(shù)據(jù),無法預(yù)先確定 ,所以需要動態(tài)的分配內(nèi)存空間,同時把不再使用的空間回收再次利用。
如鏈表的內(nèi)存就需要動態(tài)申請
1. 靜態(tài)分配&動態(tài)分配
靜態(tài)分配
在程序編譯或運行過程中,按事先規(guī)定大小分配內(nèi)存空間的分配方式。如:int a [10]
必須事先知道所需空間的大小。
分配在棧區(qū)或全局變量區(qū),一般以數(shù)組的形式。
按計劃分配。
動態(tài)分配
在程序運行過程中,根據(jù)需要大小自由分配所需空間。
按需分配。
分配在堆區(qū),一般使用特定的函數(shù)進行分配。
通常使用malloc函數(shù) void *malloc(unsigned int size); 在堆區(qū)分配一塊長度為size字節(jié)的連續(xù)區(qū)域,用來存放類型說明符指定的類型。
函數(shù)返回void*指針,使用時必須做相應(yīng)的強制類型轉(zhuǎn)換
分配的內(nèi)存空間內(nèi)容不確定,一般使用memset初始化。
使用完以后,要記得用 free()函數(shù) 釋放內(nèi)存
返回值:分配空間的起始地址 ( 分配成功 )
NULL ( 分配失敗 )
注意
1、在調(diào)用malloc之后,一定要判斷一下,是否申請內(nèi)存成功。
2、如果多次malloc申請的內(nèi)存,第1次和第2次申請的內(nèi)存不一定是連續(xù)的
例:
#include
#include
#include
int main()
{
int count,*array,n;
printf("請輸入您要申請的數(shù)組元素個數(shù)\n");
scanf("%d",&n);
array=(int *)malloc(n*sizeof(int));
if(array==NULL)
{
printf("申請內(nèi)存失敗\n");
return 0;
}
memset(array,0,n*sizeof(int));
for(count=0;count { array[count]=count; } for(count=0;count { printf("%d\n",array[count]); } free(array);//釋放array指向的內(nèi)存 return0 } free 函數(shù)(釋放內(nèi)存函數(shù)) 頭文件:#include 函數(shù)定義:void free(void *ptr) 函數(shù)說明:free函數(shù)釋放ptr指向的內(nèi)存。 例: char *p=(char *)malloc(100); free(p);// 注意 1、free后,因為沒有給p賦值,所以p還是指向原先動態(tài)申請的內(nèi)存。但是內(nèi)存已經(jīng)不能再用了,p變成野指針了。 2、一塊動態(tài)申請的內(nèi)存只能free一次,不能多次free 四、文件 文件就是存放在磁盤上的,一些數(shù)據(jù)的集合。 1.行緩沖: 標準io庫函數(shù),往標準輸出(屏幕)輸出東西的時候是行緩沖的 行緩沖只有下面幾種情況才刷新緩沖區(qū) 1-緩沖區(qū)里有換行符 "\n" 2-緩沖區(qū)滿了,自動刷新緩沖區(qū) 如: while(1) { printf("hello world "); } 3-人為刷新緩沖區(qū) fflush(stdout) 4-程序正常結(jié)束,刷新緩沖區(qū) return 0; 2.全緩沖: 標準io庫函數(shù) 往普通文件讀寫數(shù)據(jù)是全緩沖的, 碰到換行符也不刷新緩沖區(qū) 1.緩沖區(qū)滿了,刷新緩沖區(qū) 2.人為刷新緩沖區(qū) fflush(文件指針) 3.程序正常結(jié)束刷新緩沖區(qū) 3.無緩沖: 在讀寫文件的時候通過系統(tǒng)調(diào)用io (read write),對文件進行讀寫數(shù)據(jù)是無緩沖的,即寫數(shù)據(jù)會立馬進入文件,讀數(shù)據(jù)會立馬進入內(nèi)存 4.寫文件的流程: 應(yīng)用程序空間-(內(nèi)核空間 -(驅(qū)動程序--(硬盤 應(yīng)用程序和內(nèi)核程序運行在不同的空間里,目的是為了保護內(nèi)核。 通過緩沖可以減少進出內(nèi)核的次數(shù),以提高效率。 5.常用文件操作: 5.1 打開文件:FILE *fopen(const char *path, const char *mode); FILE *fp; fp=fopen(“./test.txt”,”r”); 5.2 關(guān)閉文件:int fclose(FILE *fp); 例: #include int main() { FILE *fp; int ret; fp=fopen("./test.txt","r+"); if(fp==NULL) { perror(“fopen”); return 0; } fclose(fp); return 0; } 5.3 文件定位: rewind 復(fù)位讀寫位置 把文件內(nèi)部的位置指針移到文件首 rewind(fp); ftell 測文件讀寫位置距文件開始有多少個字節(jié) int length; length = ftell(fp); fseek 定位位置指針(讀寫位置) fseek函數(shù)(一般用于二進制文件即打開文件的方式需要帶b) int fseek(FILE *stream, long offset, int whence); //int fseek(文件類型指針,位移量,起始點); 參數(shù): whence起始位置 文件開頭 SEEK_SET 0 文件當(dāng)前位置 SEEK_CUR 1 文件末尾 SEEK_END 2 offset位移量: 以起始點為基點,向前、后移動的字節(jié)數(shù),正數(shù)往文件末尾方向偏移,負數(shù)往文件開頭方向偏移。 例: fseek(fp,50,SEEK_SET) fseek(fp,-50,SEEK_END); fseek(fp,0,SEEK_END); 另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁名稱:梓益C語言學(xué)習(xí)筆記之鏈表&動態(tài)內(nèi)存&文件-創(chuàng)新互聯(lián)
分享路徑:http://weahome.cn/article/dpcgjh.html