c语言不同指令意识,C语言必须理清的概念1
當今的社會的人或多或少都有點惰性和急功近利,在一開始學習編程的時候不喜歡閱讀那些枯燥的文字,喜歡直接去閱讀代碼,漸漸地,發現一個問題,那就是編程時經常會犯一些低級錯誤,總結一下,這些錯誤源自于自己對這門語言中的基本概念一知半解,意識到那些枯燥的文字堆掌握并熟練使用一門語言的重要性,下面整理一下:
本文來自cnblogs.com/heri
1.1堆棧
是兩種數據結構
★棧:是硬件,作用是表現作為一種數據結構,只能在一端插入和刪除數據的特殊線性表。
允許插入和刪除操作的一端稱為棧頂,按照后進先出的原則存儲數據,插入:進棧push,刪除則為出棧pop,棧也被稱為先進后出表,在函數調用時用于存儲斷點,在遞歸中也會用到棧。
壓棧的操作使棧頂地址減小,彈出的操作使棧頂變大。
棧保存了一個函數調用時所需的維護信息,被稱為堆棧幀。
棧一般包括一下兩方面信息:1函數的返回地址和參數 2臨時變量(非靜態局部變量和臨時變量)
★堆:動態存儲結構,數據段中的自由存儲區,用于存儲分配動態數據,堆中存入的數據地址向增加方向變動,堆可以不斷進行分配直到沒有堆空間為止,可以隨時進行釋放,再分配,不存在順序問題。
堆內存分配通常用malloc(),calloc() ,realloc()函數實現
堆內存釋放使用free()函數
堆和棧在使用時生長方向相反,棧向底地址方向生長,堆向高地址生長。
默認函數內部的壓棧操作:從上到下,從左到右,采用4字節對齊。
數組壓棧,從最后一個元素開始,直到起始元素,從右向左。
☆在不傳遞參數的情況下,print()函數中打印出main()函數中arr數組中的各個元素
1 #include
2 voidprint()3 {4 unsigned int_ebp;5 _asm{6 mov _ebp,ebp7 }8 int *p = (int *)(*(int *)_ebp-4-4-4-7*4);9 for (int i=0;i<7;i++)10 printf("%d",p[i]);11 }12 intmain()13 {14 int a =1;15 int b =2;16 char c='a';17 int arr[]={11,12,13,14,15,16,17};18 print();19 return 0;20 }
1.2全局變量和局部變量
★全局變量:外部變量,在函數體外定義,不是哪一個函數所持有的。
全局變量又分為:外部全局變量和靜態全局變量,
區別是:
使用static存儲類別的全局變量只能在被定義的源文件使用,而使用extern存儲的全局變量,可以被其他源文件中函數引用。
★局部變量:在函數中定義的變量稱為局部變量。(形參相當于在函數中定義的變量,因此也是一種局部變量)
1.3生存期和作用域
有些人對生存期有種錯誤的理解,認為變量離開了它的作用域,其生存期就結束了。
★生存期:變量占用內存或寄存器的時長。
根據變量存儲類型不同,在編譯時,將被存放到動態存儲區或靜態存儲區,其聲明周期由聲明時存儲類型決定。
本文來自cnblogs.com/heri
靜態存儲區:存放全局變量和靜態變量,在執行程序前分配存儲空間,占用固定的存儲單元。
動態存儲區:存放函數的局部變量,返回值,形參,函數被執行過程中動態分配,執行完該函數自動釋放,這種分配和釋放是每次執行函數進行的,所以前后兩次調用同一函數,其臨時變量分配的地址可能是不同的。
1-auto
非靜態變量的局部變量即為自動變量,缺省為這個類型。
2-register
寄存器變量是為了提高執行效率,頻繁從內存單元存取變量相比于從寄存器中存取變量要多花費更多時間。
register聲明的寄存器類型的變量存放在寄存器中,不會占用內存單元,可以提高程序執行效率。不能&取地址,取不到。
事實證明,使用register的程序執行速度提高3倍,但register的數目是有限的。
3-static
靜態變量,生存期從程序開始運行到程序結束。
靜態全局變量:只能被定義的源程序文件的函數調用。
初始化區別:
靜態局部變量:在他所在的函數被執行時初始化,之后再執行該函數不再初始化,保留上一次運行的結果。
靜態全局變量:在執行main()函數之前初始化,當前值由最近一次對它賦值操作決定。
4-extern
在全局變量類型前加extern,如果沒有指定全局變量的存儲類別,則默認為extern
1.3.2作用域
一段程序代碼中所用到的變量名字并不總是有效的,限定這個bi名字的可用性的范圍就是這個名字的作用域。
局部變量的作用域僅在該函數中有效,可以在一個函數中定義與另一個函數中變量名相同的變量。
盡量避免使用相同的變量名,因為會導致IDE定位不準,可讀性不好。
1.4內部函數和外部函數
函數也同樣有作用域,如果在一個源文件中定義的函數只能被該文件中的函數所調用,二不能被同一程序其他文件中的函數調用,則為內部函數,
static 函數類型 ?函數名 (參數表)
反之為外部函數,若定義函數時沒有加關鍵字static或extern,也是外部函數,
extern 函數類型 函數名 (參數表)
區別:作用范圍不同
使用內部函數的優點是,不同人編寫不同函數時,不用擔心重名,所以,在編程過程中,只需要在一個源文件中使用的函數,要養成加static的習慣。
1.5指針變量
C語言之所以強大且有自由性,體現在對指針的靈活運用上,所以指針是C語言的靈魂。
存放地址的變量稱為:指針變量
一般變量存放的是數據本身,而指針變量存放的是地址。
但不能簡單的將指針理解為地址,而應該把指針理解為指向一塊內存區域的起始地址,指向區域的大小由所指變量的類型決定。
總結
以上是生活随笔為你收集整理的c语言不同指令意识,C语言必须理清的概念1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言用户输入编程,C语言入门教程-Pr
- 下一篇: c语言 判断链表之中是否有环,判断单链表