C语言基础笔记3
1、全局變量的有效區并不是整個文件中,而是從定義該全局變量處開始。
2、在局部棧空間定義的變量,一旦加上static后,其存儲空間就變成了常量區的靜態數據區了,其作用范圍,近似
?????全局變量,并且,如果不初始化,程序會自動賦0。如果賦值則只會賦值一次。下一次變回記住第一次的賦值。
3、static修飾全局變量是,不讓全局變量被其他文件借用,或修改。即加了權限設置。同理,對于函數來說,也
? ? ?是一樣,當其他局部函數加上static后,該函數就不能被其他函數所調用了。靜態函數只能在本文件內使用。
? ? ?extern可以用來擴寬局部變量的作用范圍。
4、定義短字節的數據(char 、short)可以節省空間。算結構體的大小時,推薦用sizeof去算。
5、學習結構體時,用scanf輸入時,就可以適當的關注其返回值了,如果有幾個成功匹配它就會返回幾。
? ? ?其中,對于空格來說,%d ?%S 都可以忽略空格,但%c ?就不行,,對于空格,它也照樣讀,這里就需要注意一
?????下了。其中一個簡單的技巧就是,在scanf里面的雙引號里面輸入一個空格eg:“ ? %c”
6、需要理解的是,一般會將結構體的定義放在主函數外面,或者更多的是放在頭文件里。注意:這里是定義的是一
?????個結構體類型,而不是變量。故它并不是全局變量。這點是值得注意的。
7、對于有前++的運算表達式? 不用拆成兩部分。直接看優先級以及結合順序。對于后++。一定先放在后一步。
? ? ?先看優先級,再看結合順序
8、鏈表是一種常見的數據結構,是動態的進行存儲分配的一種結構。
9、鏈表的建立時有:頭插法、尾插法、有序插法
頭插法:
void list_head_insert(IN OUT pstu* pphead,IN OUT pstu* pptail,IN int i)
{
? ? pstu pnew=(pstu)malloc(sizeof(stu));
? ? memset(pnew,0,sizeof(stu));
? ? pnew->num=i;
? ? if(NULL==*pphead)//當鏈表為空時,新節點即為頭節點,又為尾節點
? ? {
? ? ? ? *pphead=pnew;
? ? ? ? *pptail=pnew;
? ? }else{//當鏈表不為空時,原有的頭節點作為新節點的pnext,pnew成為新的頭
? ? ? ? pnew->pnext=*pphead;
? ? ? ? *pphead=pnew;
? ? }
}
//尾插法新建鏈表 void list_tail_insert(IN OUT pstu* pphead,IN OUT pstu* pptail,IN int i) { ? ? pstu pnew=(pstu)malloc(sizeof(stu)); ? ? memset(pnew,0,sizeof(stu)); ? ? pnew->num=i; ? ? if(NULL==*pptail) ? ? { ? ? ? ? *pphead=pnew; ? ? ? ? *pptail=pnew; ? ? }else{ ? ? ? ? (*pptail)->pnext=pnew; ? ? ? ? *pptail=pnew; ? ? } }
//有序插入 void list_sort_insert(IN OUT pstu* pphead,IN OUT pstu* pptail,IN int i) { ? ? pstu ppre,pcur; ? ? pstu pnew=(pstu)malloc(sizeof(stu)); ? ? memset(pnew,0,sizeof(stu)); ? ? pnew->num=i; ? ? ppre=*pphead; ? ? pcur=*pphead; ? ? if(NULL==ppre)//鏈表是否為空 ? ? { ? ? ? ? *pphead=pnew; ? ? ? ? *pptail=pnew; ? ? }else if(ppre->num>i)//頭插法,將新節點插入 ? ? { ? ? ? ? pnew->pnext=*pphead; ? ? ? ? *pphead=pnew; ? ? }else{//插入中間 ? ? ? ? while(pcur!=NULL) ? ? ? ? { ? ? ? ? ? ? if(pcur->num>i) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ppre->pnext=pnew; ? ? ? ? ? ? ? ? pnew->pnext=pcur; ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? } ? ? ? ? ? ? ppre=pcur; ? ? ? ? ? ? pcur=pcur->pnext; ? ? ? ? } ? ? ? ? if(NULL==pcur)//尾部插入 ? ? ? ? { ? ? ? ? ? ? ppre->pnext=pnew; ? ? ? ? ? ? *pptail=pnew; ? ? ? ? } ? ? } } 10、刪除鏈表分為四種情況:刪的是頭部,中間,尾部,以及,最后一次,刪除完后就變成空鏈表的情況。 ? ? ? ?還有一點就是刪除一個節點后,要記得釋放它的內存空間。服務器程序大部分情況下是不會運行停止的。 ? ? ? ?微軟的編譯器是masm 編譯器
//尾插法新建鏈表 void list_tail_insert(IN OUT pstu* pphead,IN OUT pstu* pptail,IN int i) { ? ? pstu pnew=(pstu)malloc(sizeof(stu)); ? ? memset(pnew,0,sizeof(stu)); ? ? pnew->num=i; ? ? if(NULL==*pptail) ? ? { ? ? ? ? *pphead=pnew; ? ? ? ? *pptail=pnew; ? ? }else{ ? ? ? ? (*pptail)->pnext=pnew; ? ? ? ? *pptail=pnew; ? ? } }
//有序插入 void list_sort_insert(IN OUT pstu* pphead,IN OUT pstu* pptail,IN int i) { ? ? pstu ppre,pcur; ? ? pstu pnew=(pstu)malloc(sizeof(stu)); ? ? memset(pnew,0,sizeof(stu)); ? ? pnew->num=i; ? ? ppre=*pphead; ? ? pcur=*pphead; ? ? if(NULL==ppre)//鏈表是否為空 ? ? { ? ? ? ? *pphead=pnew; ? ? ? ? *pptail=pnew; ? ? }else if(ppre->num>i)//頭插法,將新節點插入 ? ? { ? ? ? ? pnew->pnext=*pphead; ? ? ? ? *pphead=pnew; ? ? }else{//插入中間 ? ? ? ? while(pcur!=NULL) ? ? ? ? { ? ? ? ? ? ? if(pcur->num>i) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ppre->pnext=pnew; ? ? ? ? ? ? ? ? pnew->pnext=pcur; ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? } ? ? ? ? ? ? ppre=pcur; ? ? ? ? ? ? pcur=pcur->pnext; ? ? ? ? } ? ? ? ? if(NULL==pcur)//尾部插入 ? ? ? ? { ? ? ? ? ? ? ppre->pnext=pnew; ? ? ? ? ? ? *pptail=pnew; ? ? ? ? } ? ? } } 10、刪除鏈表分為四種情況:刪的是頭部,中間,尾部,以及,最后一次,刪除完后就變成空鏈表的情況。 ? ? ? ?還有一點就是刪除一個節點后,要記得釋放它的內存空間。服務器程序大部分情況下是不會運行停止的。 ? ? ? ?微軟的編譯器是masm 編譯器
總結
- 上一篇: Sublime Text 3 常用快捷键
- 下一篇: Ajax请求如何设置csrf_token