程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> c語言筆記

c語言筆記

編輯:關於C
第一章 概述

1.C語言的特點

①語言簡潔、緊湊,使用方便、靈活。共有32個關鍵字,9種控制語句。

②運算符豐富,公有34種運算符。

③數據結構豐富,數據類型有:整型、實型、字符型、數組、指針、結構體、共用體等。

④具有結構化的控制語句(如if…else、while、do…while、switch、for)

⑤語法限制不太嚴格,程序設計自由度大。

⑥允許直接訪問物理地址,能進行位(bit)操作,可以直接對硬件操作。

⑦生成目標代碼質量高,程序執行效率高。

⑧可移植性好。



2.C語言的用途


C雖不擅長科學計算和管理領域,但對操作系統和系統實用程序以及對硬件進行操作方面,C有明顯的優勢。現在很多大型應用軟件也用C編寫。


TopofPage


第二章 數據類型、運算符與表達式


1.C的數據類型


C的數據類型包括:整型、字符型、實型或浮點型(單精度和雙精度)、枚舉類型、數組類型、結構體類型、共用體類型、指針類型和空類型。


2.常量與變量


常量其值不可改變,符號常量名通常用大寫。變量其值可以改變,變量名只能由字母、數字和下劃線組成,且第一個字符必須為字母或下劃線。否則為不合法的變量名。變量在編譯時為其分配相應存儲單元。


3.整型數據


整型常量的表示方法:十進制不用說了,八進制以0開頭,如0123,十六進制以0x開頭,如0x1e。

整型變量分為:基本型(int)、短整型(shortint)、長整型(longint)和無符號型。不同機器上各類數據所占內存字節數不同,一般int型為2個字節,long型為4個字節。


4.實型數據


實型常量表示形式:十進制形式由數字和小數點組成(必須有小數點),如:0.12、.123、123

0.0等。指數形式如123e3代表123×10的三次方。

實型變量分為單精度(float)和雙精度(double)兩類。在一般系統中float型占4字節,7位有效數字,double型占8字節,15~16位有效數字。


5.字符型數據


字符變量用單引號括起來,如'a','b'等。還有一些是特殊的字符常量,如'\n','\t'等。分別代表換行和橫向跳格。

字符變量以char來定義,一個變量只能存放一個字符常量。

字符串常量是由雙引號括起來的字符序列。這裡一定要注意'a'和"a"的不同,前者為字符常量,後者為字符串常量,c規定:每個字符串的結尾加一個結束標志'',實際上"a"包含兩個字符:'a'和''。


6.數值型數據間的混合運算


整型、字符型、實型數據間可以混合運算,運算時不同類型數據要轉換成同一類型再運算,轉換規則:

char,short->int->unsigned->long->double<-float


7.運算符和表達式


c運算符包括:

算數運算符( + - * / % )

關系運算符(><==>=<=!=)

邏輯運算符(!&&||)

位運算符(<<>>~|^&)

賦值運算符( =)

條件運算符( ?:)

逗號運算符(,)



作者:視學中國2009-7-2515:29回復此發言

--------------------------------------------------------------------------------

2C語言筆記

指針運算符(*&)

求字節數(sizeof)

強制類型轉換(類型)

分量運算符( .->)

下標運算符( [])

其它運算符( 如函數調用運算符())

自增自減運算符( ++--)注意:++i和i++的不同之處,++i使用i之前先使i加1,i++使用i之後,使i加1。

逗號表達式的求解過程:先求解表達式1,再求解表達式2,整個表達式的值是表達式2的值。


TopofPage


第三章最簡單的c程序設計


1.c的9種控制語句:


if()~else~

for()~

while()~

do~while()

continue

break

switch

goto

return

程序的三種基本結構:順序結構,選擇結構,循環結構



2.數據輸出


c語言不提供輸入輸出語句,輸入輸出操作是由c的庫函數完成。但要包含頭文件stdio.h。

putchar()向終端輸出一個字符

printf()的格式字符:

①d格式符 用來輸出十進制整數

%d按整型數據的實際長度輸出

%md使輸出長度為m,如果數據長度小於m,則左補空格,如果大於m,則輸出實際長度

%ld輸出長整型數據

②o格式符 以八進制形式輸出整數

③x格式符 以十六進制形式輸出整數

④u格式符 用來輸出unsigned型數據,以十進制形式輸出

⑤c格式符 用來輸出一個字符

⑥s格式符 輸出一個字符串

%s 輸出實際長度字符串

%ms輸出的串占m列,如果串長度小於m,左補空格,如果大於m,實際輸出

%-ms輸出的串占m列,如果串長度小於m,右補空格,

%m.ns輸出占m列,但只取字符串中左端n個字符並靠右對齊

%-m.nsm、n含義同上,靠左對齊,如果n>m,則m自動取n值

⑦f格式符 以小數形式輸出實數

%f整數部分全部輸出,小數部分輸出6位

%m.nf輸出數據共占m列,其中有n位小數。如果數值長度小於m,左補空格

%-m.nf同上,右補空格

⑧e格式符 以指數形式輸出實數

%e系統指定6位小數,5位指數(e+002)

⑨g格式符 輸出實數,根據數值大小,自動選f格式或e格式



3.數據輸入


getchar()從終端輸入一個字符

scanf(格式控制,地址列表)標准Cscanf中不使用%u,對於unsigned型數據,以%d或%o或%x輸入。%後的*,用來跳過它相應的數據。輸入數據時不能規定精度如scanf("%7.2f",&a);是不合法的。


TopofPage


第四章邏輯運算和判斷選取控制


1.關系運算符:


c提供6種關系運算符(><<=>===!=)前四種優先級高於後兩種。


2.If語句


C提供了三種形式的if語句

If(表達式)語句

If(表達式)語句1else語句2

If(表達式1)語句1

Elseif(表達式2)語句2



else語句n


3.條件運算符



作者:視學中國2009-7-2515:29回復此發言

--------------------------------------------------------------------------------

3C語言筆記


(a>b)?a:b條件為真,表達式取值a,否則取值b


4.Switch語句


Switch(表達式)

{

case常量表達式1:語句1;break;

case常量表達式2:語句2;break;

  …

case常量表達式n:語句n;break;

  default:語句n+1;

}



TopofPage


第五章循環控制


1.幾種循環語句


goto語句(現已很少使用)

while語句 先判斷表達式後執行語句

do-while語句 先執行語句後判斷表達式

for語句


2.Break語句和continue語句


Break語句用於跳出循環,continue用於結束本次循環。



TopofPage


第六章數組


1.一維數組


c規定只有靜態存儲(static)和外部存儲(extern)數組才能初始化。給數組初始化時可以不指定數組長度。


2.二維數組


3.字符數組


部分字符串處理函數

puts(字符數組) 將一個字符串輸出到終端。

gets(字符數組)從終端輸入一個字符串到字符數組,並且得到一個函數值,為該字符數組的首地址

strcat(字符數組1,字符數組2) 連接兩個字符數組中的字符串,數組1必須足夠大。

Strcpy(字符數組1,字符串2)  將字符串2拷貝到字符數組1中。

Strcmp(字符串1,字符串2)比較字符串,相等返回0,字符串1>字符串2,返回正數,小於返回負數。
http://www.vstudycn.com
Strlen(字符數組)求字符串長度。

Strlwr(字符串) 將字符串中的大寫字母轉換成小寫

Strupr(字符串) 將字符串中的小寫字母轉換成大寫

以上是一些比較常用的字符串處理函數。



TopofPage


第七章函數


1.關於形參和實參的說明


①在函數被調用之前,形參不占內存

②實參可以是常量、變量或表達式

③必須指定形參的類型

④實參與形參類型應一致

⑤實參對形參的數據傳遞是"值傳遞",即單向傳遞


2.函數返回值


如果想讓函數返回一個值,在函數中就要用return語句來獲得,在定義函數時也要對函數值指定類型,如果不指定,默認返回整型。


3.函數調用


1)注意在函數調用時實參和形參的個數、類型應一一對應。對實參表求值的順序是不確定的,有的系統按自左至右,有的系統則按自右至左的順序。這一點要注意。

2)函數調用的方式:函數語句,函數表達式,函數參數

3)如果主調函數和被調函數在同一文件中,並且主調函數在前,那麼一般要在主調函數中對被調函數進行說明。除非:(1)被調函數的返回值類型為整型或字符型(2)被調函數出現在主調函數之前。

4)對函數的說明和定義是不同的,定義是指對函數功能的確立,包括指定函數名,函數值類型,形參及其類型、函數體等。說明則只是對已定義的函數返回值類型進行說明,只包括函數名、函數類型以及一個空的括弧,不包括形參和函數體。

5)c語言允許函數的遞歸調用(在調用一個函數的過程中又出現直接或間接的調用該函數本身)。



作者:視學中國2009-7-2515:29回復此發言

--------------------------------------------------------------------------------

4C語言筆記


4.數組作為函數參數


1)數組元素作為函數參數 和一般變量相同

2)數組名作參數應該在主調和被調函數分別定義數組,形參數組的大小可以不定義。注意:數組名作參數,不是單向傳遞。

3)多維數組作參數,在被調函數中對形參數組定義時可以省略第一維的大小說明,但不能省略第二維或更高維的說明。


5.局部變量和全局變量


從變量作用域角度分,變量可分為局部變量和全局變量。

1)內部變量(局部變量)

在一個函數內定義,只在函數范圍內有效的變量。

  2)外部變量(全局變量)

在函數外定義,可以為本文件其它函數所共用,有效范圍從定義變量的位置開始

     到本文件結束。建議盡量少使用全局變量,因為它在程序全部執行過程中都占用

     資源,而且使函數的通用性降低了。如果在定義外部變量之前的函數要想使用該

     外部變量,則應在該函數中用extern作外部變量說明。


6.動態存儲變量與靜態存儲變量


從變量值存在的時間(生存期)角度來分,可分為靜態存儲變量和動態存儲變量。靜態存儲指在程序運行期間給變量分配固定的存儲空間,動態存儲指程序運行期間根據需要動態的給變量分配存儲空間。

C語言中,變量的存儲方法分為兩大類:靜態存儲類和動態存儲類,具體包括:自動的(auto),靜態的(static),寄存器的(register),外部的(extern)。

1)局部變量的存儲方式

函數中的局部變量如不作專門說明,都之auto的,即動態存儲的,auto可以省略。局部變量也可以定義為static的,這時它在函數內值是不變的。靜態局部變量如不賦初值,編譯時系統自動賦值為0,動態局部變量如不賦初值,則它的值是個不確定的值。C規定,只有在定義全局變量和局部靜態變量時才能對數組賦初值。為提高執行效率,c允許將局部變量值放在寄存器中,這種變量叫register變量,要用register說明。但只有局部動態變量和形式參數可以作為register變量,其它不行。

2)全局變量的存儲方式

全局變量在函數外部定義,編譯時分配在靜態存儲區,可以在程序中各個函數所引用。多個文件的情況如何引用全局變量呢?假如在一個文件定義全局變量,在別的文件引用,就要在此文件中用extern對全局變量說明,但如果全局變量定義時用static的話,此全局變量就只能在本文件中引用了,而不能被其它文件引用。

3)存儲類別小結

從作用域角度分,有局部變量和全局變量

局部變量:自動變量,即動態局部變量(離開函數,值就消失)

     靜態局部變量(離開函數,值仍保留)

 寄存器變量(離開函數,值就消失)

 (形參可定義為自動變量和寄存器變量)

全局變量:靜態全局變量(只限本文件引用)

 全局變量(允許其它文件引用)

從存在的時間分,有靜態存儲和動態存儲

動態存儲:自動變量(本函數內有效)

 寄存器變量(本函數內有效)

 形參

靜態存儲:靜態局部變量(函數內有效)

 靜態全局變量(本文件內有效)

 全局變量(其它文件可引用)

從變量值存放的位置分

靜態存儲區:靜態局部變量

  靜態全局變量

全局變量

動態存儲區:自動變量和形參

寄存器內:寄存器變量


7.內部函數和外部函數


內部函數:只能被本文件中的其它函數調用,定義時前加static,內部函數又稱靜態函數。

外部函數:可以被其它文件調用,定義時前加extern,如果省略,則隱含為外部函數,在需要調用此函數的文件中,一般要用extern說明。



作者:視學中國2009-7-2515:29回復此發言

--------------------------------------------------------------------------------

5C語言筆記



TopofPage


第八章預編譯處理




c編譯系統在對程序進行通常的編譯之前,先進行預處理。c提供的預處理功能主要有以下三種:1)宏定義 2)文件包含 3)條件編譯


1.宏定義


不帶參數的宏定義

用一個指定的標識符來代表一個字符串,形式:#define標識符字符串

幾點說明:

1)宏名一般用大寫

2)宏定義不作語法檢查,只有在編譯被宏展開後的源程序時才會報錯

3)宏定義不是c語句,不在行末加分號

4)宏名有效范圍為定義到本源文件結束

5)可以用#undef命令終止宏定義的作用域

6)在宏定義時,可以引用已定義的宏名


帶參數的宏定義

定義形式:#define宏名(參數表) 字符串

這和函數有些類似,但他們是不同的:

1)函數調用時,先求實參表達式值,再代入形參,而宏只是簡單替換,並不求值

2)函數調用是在程序運行時分配內存的,而宏展開時並不分配內存,也沒有返回值的概念

3)對函數中的實參和形參都要定義類型,而且要求一致,宏名無類型,其參數也沒有類型。

4)函數只有一個返回值,而宏可以得到幾個結果

5)宏替換不占運行時間,只占編譯時間,而函數調用占運行時間


2.文件包含處理


#include"文件1"就是將文件1的全部內容復制插入到#include位置,作為一個源文件進行編譯。

在#include命令中,文件名可以用""也可以用<>,假如現在file1.c中包含file2.h文件,""表示系統先在file1.c所在目錄中找file2.h,如果找不到,再按系統指定的標准方式檢索目錄,<>表示系統直接按指定的標准方式檢索目錄。所以用""保險一點。


3.條件編譯


條件編譯指不對整個程序都編譯,而是編譯滿足條件的那部分。條件編譯有以下幾種形式:

1)#ifdef標識符

 程序段1

 #else

程序段2

#endif

它的作用:當標識符在前面已經被定義過(一般用#define),則對程序段1編譯,否則對程序段2編譯。

2)#ifndef標識符

程序段1

#else

程序段2

#endif

它的作用和#ifdef相反,當標識符沒被定義過,對程序段1編譯,否則對程序段2編譯。

3)#if表達式

程序段1

  #else

 程序段2

#endif

它的作用:當表達式值為真(非0)時,對程序段1編譯,否則對程序段2編譯。


TopofPage


第九章指針



  指針說白了就是地址。指針變量就是用來存放指針(地址)的變量。


1.變量的指針和指向變量的指針變量


讀起來很拗口,說白了就是變量的地址和用來存放變量地址的地址變量。因為一個變量在編譯的時候系統要為它分配一個地址,假如再用一個變量來存放這個地址,那麼這個變量就叫做指向變量的指針變量,也就是用來存放變量地址的這麼一個變量。所謂"指向"就是指存放××的地址,如指向變量的指針變量,"指向"就是指用來存放變量的地址,再如指向數組的指針變量,"指向"就是指存放數組的地址。只要理解了這個,指針也就不難了。另外,還有指向字符串的指針變量,指向函數的指針變量,指向指針的指針變量等。



作者:視學中國2009-7-2515:29回復此發言

--------------------------------------------------------------------------------

6C語言筆記


1)指針變量的定義

形式:類型標識符 *標識符 如:int*pointer;

要注意兩點:*表示pointer是個指針變量,在用這個變量的時候不能寫成*pointer,*pointer是pointer指向的變量。一個指針變量只能指向同一個類型的變量。如上面

pointer只能指向int型變量。


2)指針變量的引用

兩個有關的運算符:

&取地址運算符&a就代表變量a的地址

*指針運算符  *a 就代表變量a的值


2.數組的指針和指向數組的指針變量


數組的指針指數組的起始地址,數組元素的指針指數組元素的地址。

1)指向數組元素的指針變量的定義與賦值

定義和指向變量的指針變量定義相同,c規定數組名代表數組的首地址,即第一個數組元素地址。

2)通過指針引用數組元素

我們通常引用數組元素的形式是a,如果用指針可以這樣引用,*(a+i),或定義一個指針變量p,將數組a的首地址賦給p,p=a;然後用*(p+i)引用。

注意:指針變量p指向數組a首地址,則p++指向數組a的下一元素地址,即a[1]的地址。

3)數組名作函數參數

形參數組和實參數組之間並不是值傳遞,而是共用同一段地址,所以在函數調用過程中如果形參的值發生變化,則實參的值也跟著變化。

4)指向多維數組的指針和指針變量

以二維數組為居多。假設定義了一個二維數組a[3][4],那麼

a代表整個二維數組的首地址,也代表第0行的首地址,同時也是第0行第0列的元素的首地址。a+0和a[0]代表第0行首地址,a+1和a[1]代表第一行的首地址。

假設a是一個數組的首地址,那麼如果a是一維的,a+I代表第I個元素的地址,如果a是二維的,則a+I代表第I行的首地址。

那麼第一行第二列的元素地址如何表示呢?a[1]+2或&a[1][2]或*(a+1)+2。

我們只要記住:在二維數組中a代表整個數組的首地址,a代表第I行的首地址,a與*(a+I)等價就行了。只要運用熟練了就沒什麼復雜的了。

5)指向由m個整數組成的一維數組的指針變量

如:int(*p)[4],p是一個指向包含4個元素的一維數組,如果p先指向a[0],則p+1指向a[1],即p的增值是以一維數組的長度為單位的,這裡是4,舉個例子:

假設a[3][4]=,p先指向a[0]也就是數組a的首地址,那麼p+1就是a[1]的首地址即元素9的地址,因為在定義p時int(*p)[4],定義一維數組長度為4,所以p+1就等於加了一個一維數組的長度4。


3.字符串的指針和指向字符串的指針變量


1)字符串的表示形式

c中字符串有兩種表示形式:一種是數組,一種是字符指針

charstring[]="Ilovec!";

char*str="Ilovec!";

其實指針形式也是在內存中開辟了一個數組,只不過數組的首地址存放在字符指針變量str中,千萬不要認為str是一個字符串變量。

2)字符串指針作函數參數

實際上字符串指針就是數組的首地址。

3)字符指針變量與字符數組的區別

①字符數組由若干元素組成,每個元素存放一個字符,而字符指針變量只存放字符串的首地址,不是整個字符串

②對數組初始化要用static,對指針變量不用。

③對字符數組賦值,只能對各個元素賦值,不能象下面這樣:

charstr[14];

str="Ilovec!";

對指針變量可以,

char*str;

str="Ilovec!";

注意:此時賦給str的不是字符,而是字符串首地址。

④數組在定義和編譯時分配內存單元,而指針變量定義後最好將其初始化,否則指針變量的值會指向一個不確定
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved