c語言中最難也最重要的要數指標這一章了,對指標的熟練程度決定了你對
c語言的學習的好壞程度,筆者自己在學習
c語言時,在指標上花費的時間幾乎等於學習其他基礎知識的時間,所以,對指標這一章有著自己獨特的見解和學習方法。
指標,簡單來說其作用就是用來操作記憶體的,而c
語言中動態記憶體分配就是一大難點,所以我今天特別來講一下關於動態記憶體分配的問題,先給出**:
#include
#include
struct student
int id;
char name[20];
float score;
struct student *next;
int count=0;
void main()
struct student *head,*new,*old;
head=new=old=(struct student *)malloc(sizeof(struct student));
printf("請輸入學號
,姓名和分數
(空格隔開
):");
scanf("%d %s %f",&new->id,new->name,&new->score);
while(new->id!=0)
while(new->id!=0)
count++;
if(count==1)
new->next=null;
else
new->next=null;
old->next=new;
old=new;
new=(struct student *)malloc(sizeof(struct student));
printf("請輸入學號
,姓名和分數
(空格隔開
):");
scanf("%d %s %f",&new->id,new->name,&new->score);
free(new);
**分析:
由於過程中要使用malloc函式,
故先要匯入
stdlib.h
這個標頭檔案,然後先定義指向結構體變數的指標,
head
用於指向鍊錶的頭結點,
new用於指向新分配的記憶體的位址,
old14
行,將head
和new
,old
都被賦值給第一次分配的記憶體的位址,算是對指標變數的初始化吧,接下來給記憶體空間賦值,然後就是動態記憶體的核心部分,也算是比較難以理解的部分吧,定義乙個全域性變數
count
用於計數分配記憶體的次數,在這個
while
迴圈中,預設了輸入的學生的
id不能為零,如果為零,則會跳出迴圈,結束程式,否會則繼續執行。迴圈中,先給
count
自加一,表示已經分配了一次記憶體空間,然後對
count
進行判斷,當
count=1
時,由於前面只分配了一次記憶體,所以不存在新舊記憶體之分,故只用給分配的記憶體中的
next
值賦為空,即使末結點指向為空,由於上面已經對
old和
head
已經初始化,故在此不需要對其再次進行賦值操作。當
if語句執行完後,就再次進行記憶體分配操作,接著,由於
count
自加,count
已經大於
1,所以會執行
else
後面的語句,先對新分配的記憶體中的
next
賦值,使其指向為空,即如上的,每次使末節點指向為空,然後,將
old的
next
指向新分配的記憶體空間的頭結點,這就是煉錶鏈的部分。然後,將
new的值賦給
old,算是新老交換把,這裡比較難以理解,建議讀者可以找張紙畫一畫,就可以理解了。
C語言中動態記憶體分配
c語言用了蠻久了,最近在寫乙個dsp的程式,發現動態記憶體使用這一塊還是很欠缺,於是又重新看了看c的書,總結一下。之前常見的陣列或結構體內存分配,其長度必須是固定的常數,如 int a 10 等,當需要申請變長陣列時,常規的直接定義就不可以了,如float b n 其中n為變數 好像c99之後可以這...
C語言中的動態記憶體分配
目錄 什麼是記憶體的動態分配?怎樣建立記憶體的動態分配?用malloc函式開闢動態儲存區 用calloc函式開闢動態儲存區 用realloc函式重新分配動態儲存區 用free函式釋放動態儲存區 void指標型別 全域性變數是分配在記憶體中的靜態儲存區的,非靜態的區域性變數 包括形參 是分配在記憶體中...
C語言 動態記憶體分配詳解
c語言 動態記憶體分配詳解 動態記憶體分配涉及到堆疊的概念程式設計客棧 堆疊是兩種資料結構。堆疊都程式設計客棧是資料項按序排列的資料結構,只能在一端 稱為棧頂 top 對資料項進行插入和刪除。棧 作業系統 由作業系統自動分配釋放 www.cppcns.com,存放函式的引數值,區域性變數的值等。其操...