本博客根據書籍是c語言程序設計(第四版)譚浩強著 進行整理彙總
第一章
1、c語言程序執行力流程
第二章
精度問題
如果把雙精度賦值給float型變量,則會造成精度的損失。對於vitural c++的編譯器來說會出現警告,對於gcc編譯系統則不會出現警告。
數據表現形式
- 常量
- 整型常量:1000,0,-500
- 實型常量:1.25,-5.2
- 字符常量:普通字符:’a’,’#’。。轉義字符:’\n’,’\t’
- 字符串常量:”abcde”
- 符號常量:#define PI 3.1415926
注意:1、字符常量一般用單引號表示,只能是一個字符。字符串常量用雙引號表示,可以是一個字符,也可以是多個字符。2、符號常量不等於變量,符號常量不佔用內存,只是一個臨時符號,在預編譯後這個符號就不存在了,故不能對符號常量賦新值,爲了與變量相區別,所以一般用大寫表示。
變量
1、變量必須先定義後使用2、在定義時爲每一個變量名分配一個地址,變量名和地址相對應。
- 常變量:const int a = 3;
在變量存在期間其值不能改變,常變量和常量的不同之處在於:常變量有類型,佔存儲單元,只是不允許改變其值。可以說,常變量是有名字的不變量,常量是沒有名字的不變量。
- 標識符:標識符是表示變量的符號,只能有字母,數字和下劃線組成,且第一個字符必須是字母或者下劃線。
編譯系統區分大小寫,sum和SUM是兩個不同的變量名,一般變量名用小寫字母表示
數據類型
- 在定義變量時需要指定數據類型,這樣是因爲在定義時給變量分配存儲單元。
注意:不同的編譯系統分配給相同類型不同的字節數,例如Turbo C2.0爲int 分配2個字節,而vitrul c++ 則爲int 類型分配4個字節。
在計算機中數據是以補碼的形式存放
以virual c++爲例,說明每種類型的字節數
1字節 | 2字節 | 4字節 | 8字節 |
---|---|---|---|
char | short | int | long |
float | double |
只有整型可以加signed或者unsigned修飾符,輸出時用%u進行輸出
示例: unsigned short price = -1;printf(“%d”,price);
輸出是65535
解釋:系統先將-1的轉換成補碼形式,當轉換成無符號%d輸出時,按照無符號輸出,結果爲65535
所以,不能將負數存放在無符號變量中
字符型數據
基本的字符集包括127個字符,例如‘A’的ASCII代碼是65,則二進制表示形式是1000001
字符變量本質上存儲的是一個整數,佔一個字節,所以當執行如下例子時:
char c = ‘?’
printf(“%d %c”,c,c)
結果是:63,?
對於字符變量和整型變量的題來說,無論是否帶有signed還是unsigned都可以將其轉化內存中的二進制編碼進行解決
浮點型變量
在不同的編譯系統中表示方法不同
注意:在進行編譯時,對float分配4個字節,但是對於浮點型常量,則按雙精度處理,分配8個字節
賦值運算符
注意:x*=y+3 等價於 x=x*(y+3)
a=(b=5) 等價於 b=5;a=b;
a+=a-=a*a 等價於 先計算a-=a*a 再計算a+=a
輸入輸出表達式
scanf(“%d”,&a)表示對於輸入的數值放在變量a所對應的內存地址中,其實也就是將a賦值給a
以下兩個頭文件的區別:
#include<stdio.h>
#include "stdio.h"
區別:第一種帶尖括號的是:編譯系統從存放c編譯系統的子目錄中去找所要包含的文件,這稱爲標準模式。。。第二種帶引號的是:現已係統現在用戶當前目錄中尋找要包含的文件,若找不到,再按標準模式尋找。
第四章 條件判斷語句
運算符的優先級如下所示
1、c語言編譯系統在表示邏輯運算結果時,以數值1代表‘真’,以0代表‘假’。
2、對於a&&b&&c 中,如果a爲假,則不必判斷後面,直接返回結果。。同理,a||b||c中,若a爲真,則不用判斷後面,直接返回結果。
第六章 數組
注意:數組不允許動態分配大小,比如int n = 8;int a[n];這種定義數組的方法是不行的
但是,如果在被調用的函數裏面,是可以動態定義數組的,比如:
void func(int n ){
int a[2*n];
.....
}
各種類型初始化
int —–> 0
char ——> ‘\0’
指針 ——-> NULL
講解:c語言中沒有字符串類型,字符串是放在字符型數組中的
講解:當我們定義一個字符串的時候,系統會默認在字符串的最後加入一個’\0’標誌符作爲結束標誌,這正好和字符數組相對應,將字符串存放在字符數組中後,則可以以’\0’位作爲結束標誌,這讓字符串和字符數組一一對應起來,所以要求字符數組的長度要大於字符串的有效長度。講解:所以,字符數組也可以這樣賦值,如下所示,此時,字符數組長度是11,而不是10
char c[] = {"I am happy"}
注意:不能用賦值語句將一個字符串常量或字符數組直接給一個字符數組。如下面兩行是不合法的
str1 = "China";
str2 = str1;
第七章
注意:實參向形參的數據傳遞是“值傳遞”,只能由實參傳遞給形參,不能由形參傳遞給實參,實參和形參在內存中佔有不同的存儲單元,實參無法得到形參的值。
個人理解:函數在調用前要先進行聲明,目的是能夠在編譯的時候儘可能多的發現錯誤,而不至於在運行的時候發現錯誤,因爲在運行的時候發現錯誤調試比較麻煩。
注意:用數組元素作爲實參時,向形參變量傳遞的是數組元素的值,而用數組名作爲函數參數時,傳遞的是數組首元素的地址
局部變量和全局變量
在函數內部定義的變量是局部變量,在函數外定義的變量是全局變量。
當既有全局變量和局部變量重名時,起作用的是局部變量。
數據的存放方式
說明:數據分別存放在靜態存儲區和動態存儲區。靜態存儲區:全局變量。動態存儲區:函數形參;函數自動變量;函數調用的現場保護和返回地址。
靜態局部變量是在編譯時賦初值的,而動態局部變量是在運行時調用函數時賦初值的。
第八章 指針
指針變量爲什麼要加類型
因爲在編譯系統中,不同類型佔據不同的字節,在virtural c++中,Int 佔4個字節,char佔一個字節。而如果一個地址是2000,在取出值時,不知道要取多少位,如果定義了類型,則int類型則取2000–2003位,如果是char類型,則取2000–2001位。同時,在後續指針變量i_pointer++時,也是根據類型進行遞增的。
個人理解:在函數中,所有的實參到形參都是值傳遞,當爲指針時,傳遞的也是指針。
在編譯時,數組元素a[i]是按*(a+i)來進行找的
內存的動態分配
一般來說,非靜態的局部變量(包括形參)是分配在內存中的動態存儲區的,這個存儲區稱爲棧,還有一些臨時用的數據,隨時用隨時分配,存放在堆區。