一、Hello World
#include <stdio.h> int main() { /* 我的第一個 C 程序 */ printf("Hello, World! \n"); return 0; }
一個標准的hello.c文件,然后gcc hello.c -o hello,生成hello.exe(linux下生成hello.out文件),然后直接運行這個文件,屏幕輸出:Hello World!
二、變量聲明之extern關鍵字
個人理解,extern關鍵字用於引入外部變量,在函數作用域內調用全局變量。這一點在js中是可以直接調用的,而在python中是通過global關鍵字調用全局變量。
#include <stdio.h> //外部變量(全局作用域) int x; int y; int addtwonum() { //函數作用域引入全局變量 extern int x; extern int y; //給全局變量x 和 y 賦值 x = 1; y = 2; return x+y; } int main() { int result; // 調用函數 addtwonum result = addtwonum(); printf("result 為: %d",result); return 0; }
在不同文件之間進行變量的調用也是通過該關鍵字的:
#include <stdio.h> /*外部變量聲明*/ extern int x ; extern int y ; int addtwonum() { return x+y; }
#include <stdio.h> /*定義兩個全局變量*/ int x=1; int y=2; int addtwonum(); int main(void) { int result; result = addtwonum(); printf("result 為: %d\n",result); return 0; }
三、變量和常量的定義
#include <stdio.h> int main() { const int LENGTH = 10; //常量 #define WIDTH 5; //常量 int area; //變量 area = LENGTH * WIDTH; printf("value of area : %d", area); return 0; }
其實這塊遇到了一些問題 invalid type argument of unary '*' (have 'int') 在連乘的時候,百度了一下,應該看到后面指針的時候就能解決這個疑問。
四、函數
#include <stdio.h> /* 函數聲明 */ int max(int num1, int num2); int main () { /* 局部變量定義 */ int a = 100; int b = 200; int ret; /* 調用函數來獲取最大值 */ ret = max(a, b); printf( "Max value is : %d\n", ret ); return 0; } /* 函數返回兩個數中較大的那個數 */ int max(int num1, int num2) { /* 局部變量聲明 */ int result; if (num1 > num2) result = num1; else result = num2; return result; }
C語言中,要想在主程序里調用函數,必須事先對函數進行聲明,無論是在全局聲明還是局部聲明,只有聲明了才能用,所以上述的函數聲明至關重要。
五、枚舉
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
注意,枚舉的第一個值默認是0,如果沒有對其賦值的話,上述只是定義了一個枚舉類型DAY;
//先定義枚舉類,再定義枚舉變量 enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; enum DAY day; //定義枚舉類的同時定義枚舉變量 enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } day; //省略枚舉類名,直接定義枚舉變量 enum { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;
#include<stdio.h> enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; int main() { enum DAY day; day = WED; printf("%d",day); return 0; }
枚舉類是被當做int處理的,所以上述輸出3。
六、指針
首先&符號可以訪問變量在內存中的地址。
#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; }

函數指針:
#include <stdlib.h> #include <stdio.h> // 回調函數 void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) { for (size_t i=0; i<arraySize; i++) array[i] = getNextValue(); } // 獲取隨機值 int getNextRandomValue(void) { return rand(); } int main(void) { int myarray[10]; populate_array(myarray, 10, getNextRandomValue); for(int i = 0; i < 10; i++) { printf("%d ", myarray[i]); } printf("\n"); return 0; }
七、字符串
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; //或者,直接這樣: char greeting[] = "Hello"; //但是,通常我們這樣: char str1[12] = "Hello";
在 C 語言中,字符串實際上是使用 null 字符 '\0' 終止的一維字符數組。所以上述字符數組的大小比單詞 "Hello" 的字符數多一個。
1 strcpy(s1, s2); 復制字符串 s2 到字符串 s1。深克隆 2 strcat(s1, s2); 連接字符串 s2 到字符串 s1 的末尾。字符串拼接 3 strlen(s1); 返回字符串 s1 的長度。length屬性 4 strcmp(s1, s2); 如果 s1 和 s2 是相同的,則返回 0;如果 s1<s2 則返回小於 0;如果 s1>s2 則返回大於 0。 5 strchr(s1, ch); 返回一個指針,指向字符串 s1 中字符 ch 的第一次出現的位置。indexOf() 6 strstr(s1, s2); 返回一個指針,指向字符串 s1 中字符串 s2 的第一次出現的位置。
八、結構體(一種數據結構,類似於我們常見的類的聲明)
#include <stdio.h> #include <string.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main( ) { struct Books Book1; /* 聲明 Book1,類型為 Books */ /* Book1 詳述 */ strcpy( Book1.title, "C Programming"); strcpy( Book1.author, "Nuha Ali"); strcpy( Book1.subject, "C Programming Tutorial"); Book1.book_id = 6495407; /* 輸出 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); return 0; }
這和java中的變量申明還是有區別的,java中無論是基本數據類型的變量還是自定義類型變量聲明都可以直接用類型聲明:Books Book1;
