1. 程式人生 > 實用技巧 >C語言基礎知識總結大全

C語言基礎知識總結大全

1.入門程式

#include <stdio.h>
int main()
{
	printf("Hello World!");
	return 0;
}

2.資料型別

資料型別:

1.基本資料型別:

1.1. 整型:int 4個位元組

1.2. 字元型:char 1個位元組

1.3. 實型(浮點型)

  • 1.3.1.單精度型:float 4個位元組
  • 1.3.2.雙精度型:double 8個位元組

2.構造型別:

2.1.列舉型別

2.2.陣列型別

2.3.結構體型別

2.4.共用體型別

3.指標型別:

4.空型別:

3.格式化輸出語句

  • %d:十進位制整數;
  • %c:單個字元;
  • %s:字串;
  • %f:6位小數;
#include <stdio.h>
int main()
{
	int age = 18;
	float height = 1.85;
	char unit = 'm';
	printf("小明今年%d歲\n", age);
	printf("小明身高%f%c\n", height, unit);
	printf("小明現在在慕課網上學習IT技術\n");
	return 0;
}

4.常量

值不發生改變的量成為常量;

定義字元常量(注意後面沒有;)

#include <stdio.h>
#define POCKETMONEY 10 //定義常量及常量值
int main()
{
	printf("小明今天又得到%d元零花錢\n", POCKETMONEY);
	return 0;
}

5.運算子

5.1.算數運算子:+,-,*,/,%,++,--;前++/--,先運算,再取值.後++/--,先取值,再運算;

5.2.賦值運算子:

5.3.關係運算符;

5.4.邏輯運算子;

5.5.三目運算子:

  • 表示式1 ? 表示式2 : 表示式3;

6.水仙花數計算

輸出所有三位數的水仙花數字

所謂“水仙花數”是指一個三位數,其各位數字立方和等於該數,如:153就是一個水仙花數,153=111+555+333。

#include <stdio.h>

int main()
{
	//定義三位數num,個位數sd,十位數td,百位數hd
	int num, sd, td, hd;
	//迴圈所有三位數
	for( num=100 ; num<1000 ; num++ )
	{
		//獲取三位數字num百位上的數字
		hd = num/100 ;
		//獲取三位數字num十位上的數字
		td = num/10%10 ;
		//獲取三位數字num個位上的數字
		sd = num%10 ;
		//水仙花數的條件是什麼?
		if(num ==hd*hd*hd+td*td*td+sd*sd*sd )
		{
			printf("水仙花數字:%d\n", num);
		}
	}
	return 0;
}

7.列印正三角形的*

#include <stdio.h>
int main()
{
	int i, j, k;
	for(i=1; i<5; i++)
	{
		/* 觀察每行的空格數量,補全迴圈條件 */
		for( j=i ; j<5 ; j++ )
		{
			printf(" "); //輸出空格
		}
		/* 觀察每行*號的數量,補全迴圈條件 */
		for( k=0 ; k<2*i-1 ; k++ )
		{
			printf("*"); //每行輸出的*號
		}
		printf("\n"); //每次迴圈換行
	}
	return 0;
}

8.臭名遠揚的goto語句

很少使用

#include <stdio.h>
int main()
{
	int sum = 0;
	int i;
	for(i=1; i<=10; i++)
	{
		printf("%d\n", i);
		if(i==3){
			goto LOOP;//滿足條件就執行goto語句
		}
	}
	//執行goto
LOOP:printf("結束for迴圈了...."); //請選擇合適位置新增識別符號
	return 0;
}

9.形參與實參

形參:形參是在定義函式名和函式體的時候使用的引數,目的是用來接收呼叫該函式時傳入的引數;

實參:實參是在呼叫時傳遞該函式的引數。

函式的形參和實參具有以下特點:

  1. 形參只有在被呼叫時才分配記憶體單元,在呼叫結束時,即刻釋放所分配的記憶體單元。因此,形參只有在函式內部有效。函式呼叫結束返回主調函式後則不能再使用該形參變數。
  2. 實參可以是常量、變數、表示式、函式等,無論實參是何種型別的量,在進行函式呼叫時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值等辦法使實參獲得確定值。
  3. 在引數傳遞時,實參和形參在數量上,型別上,順序上應嚴格一致,否則會發生型別不匹配”的錯誤。

10.函式返回值注意

注意:void函式中可以有執行程式碼塊,但是不能有返回值,另void函式中如果有return語句,該語句只能起到結束函式執行的功能。其格式為:return;

11.遞迴

#include <stdio.h>

int getPeachNumber(int n) //這裡要定義n,要不編譯器會報錯!
{
	int num;
	if(n==10)
	{
		return 1;
	}
	else
	{
		num = (getPeachNumber(n+1)+1)*2;
		printf("第%d天所剩桃子%d個\n", n, num);
	}
	return num;
}
int main()
{
	int num = getPeachNumber(1);
	printf("猴子第一天摘了:%d個桃子。\n", num);
	return 0;
}

12.變數儲存類別 !

12.1.生存週期劃分儲存方式

C語言根據變數的生存週期來劃分,可以分為靜態儲存方式和動態儲存方式。

靜態儲存方式:是指在程式執行期間分配固定的儲存空間的方式。靜態儲存區中存放了在整個程式執行過程中都存在的變數,如全域性變數。

動態儲存方式:是指在程式執行期間根據需要進行動態的分配儲存空間的方式。動態儲存區中存放的變數是根據程式執行的需要而建立和釋放的,通常包括:函式形式引數;自動變數;函式呼叫時的現場保護和返回地址等。

12.2.儲存型別劃分

C語言中儲存類別又分為四類:自動(auto)、靜態(static)、暫存器的(register)和外部的(extern) ;

  1. 用關鍵字auto定義的變數為自動變數,auto可以省略,auto不寫則隱含定為“自動儲存類別”,屬於動態儲存方式。
  2. 用static修飾的為靜態變數,如果定義在函式內部的,稱之為靜態區域性變數;如果定義在函式外部,稱之為靜態外部變數。

注意:靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,在程式整個執行期間都不釋放;靜態區域性變數在編譯時賦初值,即只賦初值一次;如果在定義區域性變數時不賦初值的話,則對靜態區域性變數來說,編譯時自動賦初值0(對數值型變數)或空字元(對字元變數)

  1. 為了提高效率,C語言允許將區域性變數的值放在CPU中的暫存器中,這種變數叫“暫存器變數”,用關鍵字register作宣告。

注意:只有區域性自動變數和形式引數可以作為暫存器變數;一個計算機系統中的暫存器數目有限,不能定義任意多個暫存器變數;區域性靜態變數不能定義為暫存器變數。

  1. 用extern宣告的的變數是外部變數,外部變數的意義是某函式可以呼叫在該函式之後定義的變數。
#includ <stdio.h>
//來源公眾號:C語言與CPP程式設計
int main()
{
	//定義外部區域性變數
	extern int x;
	return 0;
}
int x=100;

13.內部函式外部函式 !

在C語言中不能被其他原始檔呼叫的函式稱為內部函式 ,內部函式由static關鍵字來定義,因此又被稱為靜態函式,形式為:

static [資料型別] 函式名([引數])

這裡的static是對函式的作用範圍的一個限定,限定該函式只能在其所處的原始檔中使用,因此在不同檔案中出現相同的函式名稱的內部函式是沒有問題的。

在C語言中能被其他原始檔呼叫的函式稱為外部函式 ,外部函式由extern關鍵字來定義,形式為:

extern [資料型別] 函式名([引數])

C語言規定,在沒有指定函式的作用範圍時,系統會預設認為是外部函式,因此當需要定義外部函式時extern也可以省略。 extern可以省略; 14.陣列 陣列:一塊連續的,大小固定並且裡面的資料型別一致的記憶體空間, 陣列的宣告:資料型別 陣列名稱[長度n]

  1. 資料型別 陣列名稱[長度n] = {元素1,元素2,元素3,......};
  2. 資料型別 陣列名稱[] = {元素1,元素2,元素3,......};
  3. 數類型別 陣列名稱[長度n]; 陣列名稱[0] = 元素1;陣列名稱[1] = 元素2;...... 注意: 1、陣列的下標均以0開始; 2、陣列在初始化的時候,陣列內元素的個數不能大於宣告的陣列長度; 3、如果採用第一種初始化方式,元素個數小於陣列的長度時,多餘的陣列元素初始化為0; 4、在宣告陣列後沒有進行初始化的時候,靜態(static)和外部(extern)型別的陣列元素初始化元素為0,自動(auto)型別的陣列的元素初始化值不確定。

15.陣列遍歷

#include <stdio.h>

int main()
{
	int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	int i;
	for(i=0;i<10;i++)
	{
		printf("%d\n",arr[i]);
	}
	return 0;
}
  1. 陣列的氣泡排序

氣泡排序的思想:相鄰元素兩兩比較,將較大的數字放在後面,直到將所有數字全部排序。

  1. 字串與陣列

在C語言中,是沒有辦法直接定義子字串資料型別的,需使用陣列來定義所要的字串,形式如下:

  • char 字串名稱[長度] = "字串內容";
  • char 字串名稱[長度] = {'字串1','字串2',....,'字串n','\0'};

注:

  1. []中的長度可以省略不寫;
  2. 採用第二種方式最後一個元素必須是'\0',表示結束;
  3. 第二種方式不能寫中文!; 輸出字串時,要使用:printf("%s",字元陣列名);或puts(字元陣列名);

16.字串函式

  1. strlen(s):獲取字串s的長度;
  2. strcmp(s1,s2):比較字串;比較的時候會把字串轉換成ASCII碼再進行比較,返回結果為0表示s1和s2的ASCII碼值相等,返回結果為1表示s1比s2的ASCII碼大,返回結果為-1表示s1比s2的ACSII碼小;
  3. strcpy(s1,s2):字串拷貝;s2會取代s1中的內容;
  4. strcat(s1,s2)將s2拼接到s1後面;注意:s1的length要足夠才可以!
  5. atoi(s1)將字串轉為整數!

17.多維陣列

資料型別 陣列名稱[常量表達式1]...[常量表達式n];

多維陣列的初始化與一維陣列的初始化類似也是分兩種:

  1. 資料型別 陣列名稱[常量表達式1][常量表達式2]...[常量表達式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
  2. 資料型別 陣列名稱[常量表達式1][常量表達式2]...[常量表達式n]; 陣列名稱[下標1][下標2]...[下標n] = 值;

多維陣列初始化要注意以下事項:

  1. 採用第一種始化時陣列宣告必須指定列的維數。因為系統會根據陣列中元素的總個數來分配空間,當知道元素總個數以及列的維數後,會直接計算出行的維數;
  2. 採用第二種初始化時陣列宣告必須同時指定行和列的維數。

18.多維度陣列的遍歷

使用巢狀迴圈

注意:多維陣列的每一維下標均不能越界!

19.結構體

C 陣列允許定義可儲存相同型別資料項的變數,結構是 C 程式設計中另一種使用者自定義的可用的資料型別,它允許您儲存不同型別的資料項。

結構用於表示一條記錄,假設您想要跟蹤圖書館中書本的動態,您可能需要跟蹤每本書的下列屬性:

  • Title
  • Author
  • Subject
  • Book ID

定義結構

為了定義結構,您必須使用 struct 語句。struct 語句定義了一個包含多個成員的新的資料型別,struct 語句的格式如下:

struct tag { 
    member-list
    member-list 
    member-list  
    ...
} variable-list ;

tag 是結構體標籤。

member-list 是標準的變數定義,比如 int i; 或者 float f,或者其他有效的變數定義。

variable-list 結構變數,定義在結構的末尾,最後一個分號之前,您可以指定一個或多個結構變數。下面是宣告 Book 結構的方式:

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

在一般情況下,tag、member-list、variable-list 這 3 部分至少要出現 2 個。以下為例項:

//此宣告聲明瞭擁有3個成員的結構體,分別為整型的a,字元型的b和雙精度的c
//同時又聲明瞭結構體變數s1
//這個結構體並沒有標明其標籤
struct 
{
    int a;
    char b;
    double c;
} s1;
 
//此宣告聲明瞭擁有3個成員的結構體,分別為整型的a,字元型的b和雙精度的c
//結構體的標籤被命名為SIMPLE,沒有宣告變數
struct SIMPLE
{
    int a;
    char b;
    double c;
};
//用SIMPLE標籤的結構體,另外聲明瞭變數t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
 
//也可以用typedef建立新型別
typedef struct
{
    int a;
    char b;
    double c; 
} Simple2;
//現在可以用Simple2作為型別宣告新的結構體變數
Simple2 u1, u2[20], *u3;

訪問結構成員

為了訪問結構的成員,我們使用成員訪問運算子(.)。成員訪問運算子是結構變數名稱和我們要訪問的結構成員之間的一個句號。您可以使用 struct 關鍵字來定義結構型別的變數。下面的例項演示了結構的用法:

#include <stdio.h>
#include <string.h>
//來源公眾號:C語言與CPP程式設計
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   struct Books Book1;        /* 宣告 Book1,型別為 Books */
   struct Books Book2;        /* 宣告 Book2,型別為 Books */
 
   /* Book1 詳述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;
 
   /* Book2 詳述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 輸出 Book1 資訊 */
   printf( "Book 1 title : %s\n", Book1.title);
   printf( "Book 1 author : %s\n", Book1.author);
   printf( "Book 1 subject : %s\n", Book1.subject);
   printf( "Book 1 book_id : %d\n", Book1.book_id);
 
   /* 輸出 Book2 資訊 */
   printf( "Book 2 title : %s\n", Book2.title);
   printf( "Book 2 author : %s\n", Book2.author);
   printf( "Book 2 subject : %s\n", Book2.subject);
   printf( "Book 2 book_id : %d\n", Book2.book_id);
 
   return 0;
}

20.共用體

共用體是一種特殊的資料型別,允許您在相同的記憶體位置儲存不同的資料型別。您可以定義一個帶有多成員的共用體,但是任何時候只能有一個成員帶有值。共用體提供了一種使用相同的記憶體位置的有效方式。

#include <stdio.h>
#include <string.h>
 
union Data
{
   int i;
   float f;
   char  str[20];
};
 
int main( )
{
   union Data data;        
 
   printf( "Memory size occupied by data : %d\n", sizeof(data));
 
   return 0;
}

21.指標

#include <stdio.h>
 
int main ()
{
   int  var = 20;   /* 實際變數的宣告 */
   int  *ip;        /* 指標變數的宣告 */
 
   ip = &var;  /* 在指標變數中儲存 var 的地址 */
 
   printf("Address of var variable: %p\n", &var  );
 
   /* 在指標變數中儲存的地址 */
   printf("Address stored in ip variable: %p\n", ip );
 
   /* 使用指標訪問值 */
   printf("Value of *ip variable: %d\n", *ip );
 
   return 0;
}

22.檔案讀寫

寫入檔案

#include <stdio.h>
 
int main()
{
   FILE *fp = NULL;
 
   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}

讀取檔案

#include <stdio.h>
 
int main()
{
   FILE *fp = NULL;
   char buff[255];
 
   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1: %s\n", buff );
 
   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);
 
}


C語言控制led燈
http://www.makeru.com.cn/live/1392_304.html?s=45051

輸入和輸出
http://www.makeru.com.cn/live/1758_312.html?s=45051
C高階之結構體
http://www.makeru.com.cn/live/1392_656.html?s=45051

C語言實現面向物件程式設計
http://www.makeru.com.cn/live/1392_1051.html?s=45051
結構體普及與應用
http://www.makeru.com.cn/live/5413_1909.html?s=45051
C語言玩轉連結串列
http://www.makeru.com.cn/live/1392_338.html?s=45051
資料型別、常量、變數及運算子
http://www.makeru.com.cn/video/1877.html?s=45051
C語言與資料結構的經典實戰案例
http://www.makeru.com.cn/live/5413_2014.html?s=45051