十年網站開發(fā)經驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網站問題一站解決
梓益C語言學習筆記之鏈表&動態(tài)內存&文件
一、定義:
鏈表是一種物理存儲上非連續(xù),通過指針鏈接次序,實現(xiàn)的一種線性存儲結構。
二、特點:
鏈表由一系列節(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)內存申請
在實際的編程中,有時所需的內存空間取決于實際輸入的數(shù)據(jù),無法預先確定 ,所以需要動態(tài)的分配內存空間,同時把不再使用的空間回收再次利用。
如鏈表的內存就需要動態(tài)申請
1. 靜態(tài)分配&動態(tài)分配
靜態(tài)分配
在程序編譯或運行過程中,按事先規(guī)定大小分配內存空間的分配方式。如: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*指針,使用時必須做相應的強制類型轉換
分配的內存空間內容不確定,一般使用memset初始化。
使用完以后,要記得用 free()函數(shù) 釋放內存
返回值:分配空間的起始地址 ( 分配成功 )
NULL ( 分配失敗 )
注意
1、在調用malloc之后,一定要判斷一下,是否申請內存成功。
2、如果多次malloc申請的內存,第1次和第2次申請的內存不一定是連續(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");
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指向的內存 return0 } free 函數(shù)(釋放內存函數(shù)) 頭文件:#include 函數(shù)定義:void free(void *ptr) 函數(shù)說明:free函數(shù)釋放ptr指向的內存。 例: char *p=(char *)malloc(100); free(p);// 注意 1、free后,因為沒有給p賦值,所以p還是指向原先動態(tài)申請的內存。但是內存已經不能再用了,p變成野指針了。 2、一塊動態(tà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-程序正常結束,刷新緩沖區(qū) return 0; 2.全緩沖: 標準io庫函數(shù) 往普通文件讀寫數(shù)據(jù)是全緩沖的, 碰到換行符也不刷新緩沖區(qū) 1.緩沖區(qū)滿了,刷新緩沖區(qū) 2.人為刷新緩沖區(qū) fflush(文件指針) 3.程序正常結束刷新緩沖區(qū) 3.無緩沖: 在讀寫文件的時候通過系統(tǒng)調用io (read write),對文件進行讀寫數(shù)據(jù)是無緩沖的,即寫數(shù)據(jù)會立馬進入文件,讀數(shù)據(jù)會立馬進入內存 4.寫文件的流程: 應用程序空間-(內核空間 -(驅動程序--(硬盤 應用程序和內核程序運行在不同的空間里,目的是為了保護內核。 通過緩沖可以減少進出內核的次數(shù),以提高效率。 5.常用文件操作: 5.1 打開文件:FILE *fopen(const char *path, const char *mode); FILE *fp; fp=fopen(“./test.txt”,”r”); 5.2 關閉文件: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 復位讀寫位置 把文件內部的位置指針移到文件首 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 文件當前位置 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); 另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
文章標題:梓益C語言學習筆記之鏈表&動態(tài)內存&文件-創(chuàng)新互聯(lián)
網頁地址:http://www.jiaotiyi.com/article/dpcgjh.html