C語言摘要

C的程式結構

#include //前置處理器指令
void main(void){
 //main表示主函式並第一個被執行,
 //第一個void表示沒有資訊被回傳,
 //第二個void表示沒有資訊會傳進main中
 printf(“this is c”);
}

變數宣告

1. ansi c最長變數名為31個字元
2. int除int若有小數則自動被捨去,若int和float進行算術運算則結果為float
3. (float)5; //強迫轉型運算,格式為:(型別)值
4. #define PI 3.1415 //常數宣告,定義常數PI(習慣大寫)為3.1415
5. 數字除以0會產生溢位overflow的錯誤訊息
6. 型別 *p;宣告p為一個指標變數,只能存放記憶體位置(可用&取址運算子)
ps:
&var用來取得var的記憶體位址,*men根據men的記憶體位置取出內容),*稱做dereference
ex:p=&var;/*p取得var位址*/ *p=5;/*將5存到p指的位址*/
ps:
變數型別
char ,格式%c //宣告字元變數,值要用單引號包起來
int ,保留16bit記憶體,範圍為-32767到32767 ,格式%d
unsigned int ,2byte,範圍為0-65,535 ,格式%d
long int 4byte,範圍為-2,147,483,647到2,147,483,647,格式%ld
unsigned long int 4byte,範圍0-4,294,967,295,格式%ld
float,保留32bit記憶體,數字會自動加小數點,範圍1.1754944E-38到3.4028235E+38,,格式%f,精確位數6
double,保留64bit記憶體,範圍2.2250738E-308到1.7976935E+308, ,格式%lf,精確位數15
long double,10byte,範圍接近1.0E-4931到1.0E+4932,,格式%Lf,精確位數19
FILE 導出型資料型別derived data type

陣列

常見有二種宣告方式
1. 型別 名稱[個數]
ex:int a[2]; int b[3][2];
2. 型別 名稱[(個數)]={1,2,3,…}
ex:int c[2]={1,2};//宣告二個元素
ex:int d[]={1,2,3};//宣告三個元素
ps:
存取超越陣列時,則存取陣列後無法預期的記憶體位置,而結果也不可預期
ps:
strlen(陣列); //回傳陣列有值元素的數量
sizeof(陣列);//回傳陣列佔用的儲存數目

字串

注意1,儲存字串時會自動在結尾加null character(空字元),以斜線0表示,而實際大小為原字串大小+1個空字元
注意2,存字串的陣列或指標變數要用char宣告
char *var=”字串”; //字串指標,將字串位址儲存到var
char var[]=”字串”; //將字串本身變成各字元儲存進剛宣告的var陣列
char *var[]={“字串1″,”字串2″,”字串3”,…}; //字串指標陣列,將字串位址儲存到var,[]內空白則自動等於字串數
char var[][個數]={“字串1″,”字串2″,”字串3”,…}; //將各字串儲存進var陣列中,[]內空白則自動等於字串數
char *var,bb[10];var=bb; //將字串bb陣列複製到指標變數a,而a等同於bb
char var[20] //宣告可以儲存19個字元+1個null character的字串變數
char var[4]={‘a’,’b’,’c’,’d’,’斜線0′,}; //由字元陣列變成字串,值為abcd
ps:
字元表示
10進位表示法 ex:a=’65’
8進位表示法 ex:A=’101′
16進位表示法 ex:a=’x61′
字元編碼可參考ASCII表
ex:會顯示a 97
char c;
c = ‘x61’;
printf(“%c %d”, c, c);
ps:
字串處理常用函式 
strcpy(陳列,”字串”); //將字串變成各字元儲存進己宣告過的陣列
strcpy(陳列1,陳列2); //把字串陣列2複製到字串陣列1
puts(存字串的陣列); //列出字串在螢幕,並自動斷行
printf(“%s”,存字串的陣列);//列出字串在螢幕
strcmp(字串1,字串2); //若兩字串相同則傳回0
atoi(字串); //將字串型態的數字轉換為int型態
ps:
c語言本身沒有字串,而是透過字元與陣列達到字串的效果

函式

基本型
void fun1(int n);
//宣告原型:和變數一樣有自己的型別,在這裡宣告一個void(不傳回)型別的函式fun1,並用一個int的引數
void fun1(int n){ //定義本體:定義fun1的內容
敘述;}
fun1(var); //呼叫fun1函式,因為宣告時引數指定用int,所以var也要為int格式
回傳多值用法,如下
void fun(int *c);
//這裡的*指宣告指示器,指示一個位置被儲存在變數的記憶體儲存格中
void fun(int *c){ //定義函式本體的*c可省略
*c=1; } //這裡的*表單元算子,指示去那一個位置
fun(&a); //a的結果為1
和陣列使用,如下
void fun(const double b[][3]);
//預設陣列在函式內都能被改變,但加了const則不行,陣列第一維要空著,二維之後才要加個數
void fun(const double b[][3]);{ //ex:若是一維陣列則為b[]及可,三維陣列則為b[][2][4]
敘述; }
fun(e); //e是陣列
接收字串做引數時,如下
char *a=”字串”,*b[]={“字串1″,”字串2″},c[]=”字串”,c[][個數]={“字串1″,”字串2”}; //宣告了四種不同型別的字串
void fun(char *a,char *b[],char c[],char c[][個數]);
//若函數有字串做引數,則引數要和在main宣告的型別一樣
void fun(char *a,char *b[],char c[],char c[][個數]);{
敘述; }
fun(a,b,c,d); // 只需放名稱及可

控制結構

1. 算術順序++,– > ! > && > || > =
2. var=(算式)?算式為真敘述:算式為假敘述;
3. if(算式){敘述1}else{敘述2}
4. if(算式){敘述1}if else(算式){敘述2}else{敘述3}
5. while(算式){敘述}
6. switch(算式){
 case 常數1:
  敘述…;break;
 case 常數2:
  敘述…;break;
 default
  敘述;
 }

struct

能夠結合多個彼此相關的變數在一個名稱之下,且可以包含數個不同資料型態的變數
基本格式:
struct 名稱{ //宣告結構
 型態 欄位1,…; //支援巢狀結構,型態也可用其他結構定義的
 型態 欄位2,…; //欄位可放變數,陣列或指標
 struct 名稱 *pname; //自我參考結構
} 變數a,變數b……; //結構宣告時順便宣告變數
struct 名稱 var,a[範圍],*p; //宣告使用此結構的變數,陣列,指標
var.欄位=值;
a[範圍].欄位=值;
p->欄位=值; //也等同(*p).欄位
使用typedef
typedef struct 名稱1{ //名稱1可省略
 ….同上
}名稱2;
名稱2 變數1,變數2; //使用typedef則宣告變數時不用加struct
另一種宣告
typedef struct 結構名稱 *新結構名稱;
typedef struct 結構名稱{
 型態 欄位1,…;
 新結構名稱 欄位2,….; //自我參考結構


常用函式

malloc(size)
用來配置動態記憶體空間,size以位元組為單位,傳回值為配置到的記憶體空間的位址
ex: *p=malloc(1024); //配置1k的記憶體
sizeof(型別)
回傳型別佔用的記憶體大小,以byte為單位
free(void *ptr)
*ptr為先前由malloc(),calloc(),realloc()…等傳回的記憶體指標,呼叫後*ptr指的記憶體空間便會被系統收回
關於printf()轉換指示
int用 %[欄寬]d ,如int的%5d
float用 %[欄寬][精確位數]f,如float的%9.2f
double用 %[欄寬][精確位數]lf,%f似乎也行
從鍵盤讀資料scanf
scanf(“%d”,&month); //讀取鍵盤輸入的數值經格式化轉換後存到month
scanf(“%s”,string); //讀取鍵盤輸入的字存到string中,string是陣列格式
從鍵盤讀單一字元
c=getchar(); //讀取鍵盤輸入的一個字元存到c中
開啟檔案 fopen
inptr=fopen(“filename”,”act”)
act=r表讀取,w表寫入
關於讀檔fscanf
ex:
char str[100];
int num;
FILE *inptr; //宣告檔案指標變數
inptr=fopen(“filename”,”r”); //呼叫fopen函式讀檔並將值傳給檔案指標
fscanf(inptr,”%s”,str); //將檔案指標指示的檔案經格式化轉換後讀進var變數
fscanf(inptr,”%d”,&num)
fclose(inptr); //關閉inptr所指向的檔案
printf (“int: %d and string: %s n”,num,str);
 


補充

常數
BUFSIZ,輸入緩衝區大小的巨集常數
脱離序列(escape sequences)
換行 斜線n
嗶聲 斜線a
c的保留字,(不可以此名稱做為變數名)
const 設定變數只可讀
其他還有auto,do,enum,extern…
各引頭檔
stdio.h基本
math.h數學函數