C語言筆記

本博客根據書籍是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)來進行找的

內存的動態分配

一般來說,非靜態的局部變量(包括形參)是分配在內存中的動態存儲區的,這個存儲區稱爲棧,還有一些臨時用的數據,隨時用隨時分配,存放在堆區。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章