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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

梓益C语言学习笔记之链表&动态内存&文件

發布時間:2025/4/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 梓益C语言学习笔记之链表&动态内存&文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

梓益C語言學習筆記之鏈表&動態內存&文件

一、定義:

鏈表是一種物理存儲上非連續,通過指針鏈接次序,實現的一種線性存儲結構。

二、特點:

鏈表由一系列節點(鏈表中每一個元素稱為節點)組成,節點在運行時動態生成(malloc),每個節點包括兩個部分:

存儲數據元素的數據域

存儲下一個節點地址的指針域

如:

  typedef struct student

  { ?

int num;

char name[20];

struct student *next;

? ? }STU;

三、動態內存申請

在實際的編程中,有時所需的內存空間取決于實際輸入的數據,無法預先確定 ,所以需要動態的分配內存空間,同時把不再使用的空間回收再次利用。

如鏈表的內存就需要動態申請


1. 靜態分配&動態分配

靜態分配

在程序編譯或運行過程中,按事先規定大小分配內存空間的分配方式。如:int a [10]

必須事先知道所需空間的大小。

分配在棧區或全局變量區,一般以數組的形式。

按計劃分配。

動態分配

在程序運行過程中,根據需要大小自由分配所需空間。

按需分配。

分配在堆區,一般使用特定的函數進行分配。

通常使用malloc函數 ? ? void *malloc(unsigned int size); ? 在堆區分配一塊長度為size字節的連續區域,用來存放類型說明符指定的類型。

函數返回void*指針,使用時必須做相應的強制類型轉換?

分配的內存空間內容不確定,一般使用memset初始化。

使用完以后,要記得用 ?free()函數 ?釋放內存?

返回值:分配空間的起始地址 ( 分配成功 )

?NULL ? ? ? ? ? ? ? ? ? ? ? ? ?( 分配失敗 )

注意

1、在調用malloc之后,一定要判斷一下,是否申請內存成功。

2、如果多次malloc申請的內存,第1次和第2次申請的內存不一定是連續的

例:

#include<stdlib.h>

#include<stdio.h>

#include<string.h>

int main()

{

int count,*array,n;

printf("請輸入您要申請的數組元素個數\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<n;count++)

{

array[count]=count;

}

for(count=0;count<n;count++)

{

printf("%d\n",array[count]);

}


free(array);//釋放array指向的內存


return0

}

free 函數(釋放內存函數)

頭文件:#include<stdlib.h>

函數定義:void free(void *ptr)

函數說明:free函數釋放ptr指向的內存。

例:

char *p=(char *)malloc(100);

free(p);//?

注意

1、free后,因為沒有給p賦值,所以p還是指向原先動態申請的內存。但是內存已經不能再用了,p變成野指針了。

2、一塊動態申請的內存只能free一次,不能多次free


四、文件

文件就是存放在磁盤上的,一些數據的集合。

1.行緩沖:

標準io庫函數,往標準輸出(屏幕)輸出東西的時候是行緩沖的

? 行緩沖只有下面幾種情況才刷新緩沖區

? 1-緩沖區里有換行符 ?"\n"

2-緩沖區滿了,自動刷新緩沖區

如: while(1)

{

printf("hello world ");

}

3-人為刷新緩沖區 fflush(stdout)

4-程序正常結束,刷新緩沖區 return 0;


2.全緩沖:

標準io庫函數 往普通文件讀寫數據是全緩沖的,

碰到換行符也不刷新緩沖區

1.緩沖區滿了,刷新緩沖區

2.人為刷新緩沖區 fflush(文件指針)

3.程序正常結束刷新緩沖區

3.無緩沖:

在讀寫文件的時候通過系統調用io (read write),對文件進行讀寫數據是無緩沖的,即寫數據會立馬進入文件,讀數據會立馬進入內存


4.寫文件的流程:

應用程序空間-(內核空間 -(驅動程序--(硬盤

應用程序和內核程序運行在不同的空間里,目的是為了保護內核。

通過緩沖可以減少進出內核的次數,以提高效率。


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<stdio.h>

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 測文件讀寫位置距文件開始有多少個字節

? int length; ? length = ftell(fp);?


fseek 定位位置指針(讀寫位置)

fseek函數(一般用于二進制文件即打開文件的方式需要帶b)

int fseek(FILE *stream, long offset, int whence); ?//int fseek(文件類型指針,位移量,起始點);?

參數:

whence起始位置?

文件開頭 ? ? ? ? SEEK_SET ? ? 0

文件當前位置 ? ? SEEK_CUR ? ? 1

文件末尾 ? ? ? ? SEEK_END ? ? 2

offset位移量:

以起始點為基點,向前、后移動的字節數,正數往文件末尾方向偏移,負數往文件開頭方向偏移。

例:

fseek(fp,50,SEEK_SET)

fseek(fp,-50,SEEK_END);

fseek(fp,0,SEEK_END);


轉載于:https://blog.51cto.com/13603157/2082832

總結

以上是生活随笔為你收集整理的梓益C语言学习笔记之链表&动态内存&文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。