//類似於java import 引入頭文件 int main() { printf("Hello,C\n");//輸入語句 // system("pause");//暫停 讓cmd窗口不消失 return 0; } " data-snippet-id="ext.5bb8d5606ae4a3f75e42babc2b126c74" data-snippet-saved="false" data-codota-status="done">#include//類似於java import 引入頭文件 int main() { printf("Hello,C\n");//輸入語句 // system("pause");//暫停 讓cmd窗口不消失 return 0; }
第一個沒啥好講的,include類似JAVA的import導包操作,以前學習C的之後一直寫#include< stdio.h>老師也沒說,不知道是個啥!現在才恍然明白原來是standard i/o的意思.默認是有一個返回值的(void也是可以的,但是C++好像就強制要求要返回值),一般return 0;作為程序的正常結束。
int main(){ //基本數據類型 字符型 char| 整型 short int long | 浮點型 float double |有符號 signed |無符號 unsigned|void 空 char c = 'a'; short a = 10; int i = 10; long q = 10; float x = 10; double y = 10; printf(" i = %d \n",i); } " data-snippet-id="ext.ee2a10fe64308b41bbcc87f7e41ff8fb" data-snippet-saved="false" data-codota-status="done">#includeint main(){ //基本數據類型 字符型 char| 整型 short int long | 浮點型 float double |有符號 signed |無符號 unsigned|void 空 char c = 'a'; short a = 10; int i = 10; long q = 10; float x = 10; double y = 10; printf(" i = %d \n",i); }
在C中變量需要先定義後使用,不能像java一樣,在哪裡需要就直接 int i=0;在C中是行不通的.
常用數據類型長度在32 位的系統上
short 出來的內存大小是2 個byte;
int 出來的內存大小是4 個byte;
long 出來的內存大小是4 個byte;
float 出來的內存大小是4 個byte;
double 出來的內存大小是8 個byte;
char 出來的內存大小是1 個byte。
(具體長度和平台有關,可以用sizeof 方法測試一下)
輸出時不同輸出格式都有那些呢?
(1)d(或i)格式符。用來輸出十進制整數,有以下幾種用法:
??①%d,按整型數據的實際長度輸出。
??②%md,m為指定的輸出字段的寬度。如果數據的位數小於m,
?? 則左端補以空格,若大於m,則按實際位數輸出。
?? ③%ld(%mld 也可),輸出長整型數據。
??例如:long a=123456;
?? printf(“%ld”,a);
(2)o格式符,以八進制數形式輸出整數。格式:%o,%mo,%lo,%mlo都可。
(3)x(或X)格式符,以十六進制數形式輸出整數。格式:%x,%mx,%lx,%mlx都可。
(4)u格式符,用來輸出unsigned型數據,即無符號數,以十進制數形式輸出。
格式:%u,%mu,%lu都可。
(5)c格式符,用來輸出一個字符。格式:%c,%mc都可。
(6)s格式符,用來輸出一個字符串。格式:%s,%ms,%-ms,%m.ns,%-m.ns都可。
(7)f格式符,用來輸出實數(包括單、雙精度),以小數形式輸出。格式:%f,%m.nf,%-m.nf都可。
注意:單精度實數的有效位數一般為7位,雙精度為16位。
(8)e(或E)格式符,以指數形式輸出實數。格式:%e,%m.ne,%-m.ne都可。
(9)g(或G)格式符,用來輸出實數,它根據數值的大小,自動選f格式或e格式(選擇輸出時占寬度較小的一種)。
int main() { //c99標准 int i; for(i = 0; i<100; i++) { printf(" i = %d\n",i); } system("pause");//暫停 讓cmd窗口不消失 }" data-snippet-id="ext.29dffee7d9765d50adbdad7086c1deff" data-snippet-saved="false" data-codota-status="done">#includeint main() { //c99標准 int i; for(i = 0; i<100; i++) { printf(" i = %d\n",i); } system("pause");//暫停 讓cmd窗口不消失 }
這個java的區別就在於,java可以在任何需要的地方直接創建個變量,for一般寫成
for(int i = 0; i<100; i++) { }
C則需要先聲明變量.下面是常見的語句
int main() { int* p;//定義一個int*類型的指針變量 p int i = 10;//定義一個int類型的變量 i i就有一個內存地址值 //指針賦值 &就是取內存地址,將i的地址賦值給p p = &i; printf("i = %d\n",i);//直接獲取i的值 *:獲取指針變量指向的值 printf("通過指針對象去獲取 i = %d \n",*p); printf("指針變量p = %d \n",p); //重點: 特殊: * & //1 怎麼定義指針變量 類型* 變量名; //2 怎麼賦值 p = &i; //3 怎麼拿值 int i = *p; system("pause");//暫停 讓cmd窗口不消失 }" data-snippet-id="ext.40001aaa81076738ded619164af5d58b" data-snippet-saved="false" data-codota-status="done">#includeint main() { int* p;//定義一個int*類型的指針變量 p int i = 10;//定義一個int類型的變量 i i就有一個內存地址值 //指針賦值 &就是取內存地址,將i的地址賦值給p p = &i; printf("i = %d\n",i);//直接獲取i的值 *:獲取指針變量指向的值 printf("通過指針對象去獲取 i = %d \n",*p); printf("指針變量p = %d \n",p); //重點: 特殊: * & //1 怎麼定義指針變量 類型* 變量名; //2 怎麼賦值 p = &i; //3 怎麼拿值 int i = *p; system("pause");//暫停 讓cmd窗口不消失 }
指針原理圖:
Note:需要注意的是,指針*p在左與在右的區別:
int i = 0;
int *p = &i;
int j = *p; // *p出現在右邊,表示p指向的int型變量的值
*p = 2; // *p出現在左邊,表示p指向int型變量的內存空間
//類似於java import 引入頭文件 int main() { //typedef int** pi;//聲明新的數據類型,代替了int** 數據類型,類似取別名 //定義多級指針 int i = 10; int* p = &i; int** q = &p; int*** r = &q; //通過r獲取i的值 printf("i = %d \n",***r); //通過q獲取i的值 printf("i = %d \n",**q); //通過p獲取i的值 printf("i = %d \n",*p); //規律:看前面的*號 數量 ,取值的時候,有多少個*,取值的時候就用多少個*號 system("pause");//暫停 讓cmd窗口不消失 }" data-snippet-id="ext.c5a6bac3333814ce10e96ddad84384c2" data-snippet-saved="false" data-codota-status="done">#include//類似於java import 引入頭文件 int main() { //typedef int** pi;//聲明新的數據類型,代替了int** 數據類型,類似取別名 //定義多級指針 int i = 10; int* p = &i; int** q = &p; int*** r = &q; //通過r獲取i的值 printf("i = %d \n",***r); //通過q獲取i的值 printf("i = %d \n",**q); //通過p獲取i的值 printf("i = %d \n",*p); //規律:看前面的*號 數量 ,取值的時候,有多少個*,取值的時候就用多少個*號 system("pause");//暫停 讓cmd窗口不消失 }
多級指針在使用的時候並沒有和一級指針有太多的區別,其實就是二級指針就是指向一級指針地址的指針,三級指針就是指向二級指針地址的指針,類推
數組簡單來說就是存放指定數據類型的一種數據結構.
他是一種指針類型的變量.直接使用指針變量arr,默認是指向數組的首地址
下面是一個int型的數組的賦值與取值操作:
//類似於java import 引入頭文件 int main() { //定義數組 int arr[10]; int i; //循環賦值 for(i = 0; i<10; i++) { arr[i] = i; } //循環輸出 倒著輸出 for(i=9; i>=0; i--) { printf("arr[%d] = %d \n",i,arr[i]); } system("pause");//暫停 讓cmd窗口不消失 }" data-snippet-id="ext.12e8ab2bd279bd8cc10170c9ee323773" data-snippet-saved="false" data-codota-status="done">#include//類似於java import 引入頭文件 int main() { //定義數組 int arr[10]; int i; //循環賦值 for(i = 0; i<10; i++) { arr[i] = i; } //循環輸出 倒著輸出 for(i=9; i>=0; i--) { printf("arr[%d] = %d \n",i,arr[i]); } system("pause");//暫停 讓cmd窗口不消失 }
因為數組是一個指針類型的變量,默認指向首地址,我們可以通過指針變量指向地址的偏移來取數組指定位置的值,需要注意的是不同數據類型的偏移量,如:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
int arr[] = {1,5,8};
int i;
for(i = 0; i<3; i++) {
printf("arr[%d] = %d \n",i,*(arr+i));//指針變量偏移再取值
}
學了java回頭看C語言的結構體(或者說是結構),就感覺特別親切,因為他和類特別像,大概結構體的設計就有面向對象編程的思想在裡面
//定義結構體 struct person { int age; }; int main() { struct person p;//定義一個結構變量 //給結構體裡面的屬性賦值 p.age = 18; printf("p.age = %d \n",p.age); system("pause");//暫停 讓cmd窗口不消失 }" data-snippet-id="ext.d6066db64ae382fbe620055ea0d719af" data-snippet-saved="false" data-codota-status="done">#include//定義結構體 struct person { int age; }; int main() { struct person p;//定義一個結構變量 //給結構體裡面的屬性賦值 p.age = 18; printf("p.age = %d \n",p.age); system("pause");//暫停 讓cmd窗口不消失 }
需要注意的是定義結構體的關鍵字struct,還有就是結構體應該在開始的時候聲明,結構體名的書寫C裡面一般都是小寫,而不是像java一樣類名開頭要大寫,當然這是編寫習慣,大寫也不會提示錯誤
//類似於java import 引入頭文件 //定義結構 struct person { int age; } *p; //定義了一個結構體指針變量 int main() { //動態申請內存 p = (struct person*)malloc(sizeof(struct person)); /* //賦值 (*p).age = 21;//James //輸出 printf("p.age = %d\n",(*p).age); */ p->age = 2; printf("p->age = %d \n",p->age); system("pause");//暫停 讓cmd窗口不消失 }" data-snippet-id="ext.4737c61d1d7144fde6600b5c55841ee5" data-snippet-saved="false" data-codota-status="done">#include//類似於java import 引入頭文件 //定義結構 struct person { int age; } *p; //定義了一個結構體指針變量 int main() { //動態申請內存 p = (struct person*)malloc(sizeof(struct person)); /* //賦值 (*p).age = 21;//James //輸出 printf("p.age = %d\n",(*p).age); */ p->age = 2; printf("p->age = %d \n",p->age); system("pause");//暫停 讓cmd窗口不消失 }
需要注意的是*p一開始並沒分配內存,就類似java的一個變量,只是聲明了並沒有做new的操作,所以我們要new一下,調用C的分配內存的方法給p分配一個person數據類型大小的內存,並把p強轉為person類型
p = (struct person*)malloc(sizeof(struct person));
在上面我們看到兩種給結構體變量賦值的方式,這並沒有好壞自分,看個人習慣
方式一:(*p).age = 21;//James
*p表示數據類型person,這類似java裡面 類名.數據類型
方式二:p->age = 2;//James
p表示指針,p->則指向這個數據類型age的地址
//聲明一個函數 int add(int x,int y); int main() { int x = 1,y = 1; //使用函數 int z = add(x,y); printf(" x + y = %d\n",z); system("pause");//暫停 讓cmd窗口不消失 } //實現函數 add(int x,int y) { return x + y; }" data-snippet-id="ext.803a7d9dff5358b0e7d8a459a77be2f2" data-snippet-saved="false" data-codota-status="done">#include//聲明一個函數 int add(int x,int y); int main() { int x = 1,y = 1; //使用函數 int z = add(x,y); printf(" x + y = %d\n",z); system("pause");//暫停 讓cmd窗口不消失 } //實現函數 add(int x,int y) { return x + y; }
在C裡面函數需要在開始的時候先聲明,當然你在生命的時候實現也是可以的,但是並不推薦這樣做
//聲明並實現一個函數,不推薦 int add(int x,int y) { return x + y; } int main() { int x = 1,y = 1; //使用函數 int z = add(x,y); printf(" x + y = %d\n",z); system("pause");//暫停 讓cmd窗口不消失 }" data-snippet-id="ext.8f8fada690b48a9c13afd0279bc0899c" data-snippet-saved="false" data-codota-status="done">#include//聲明並實現一個函數,不推薦 int add(int x,int y) { return x + y; } int main() { int x = 1,y = 1; //使用函數 int z = add(x,y); printf(" x + y = %d\n",z); system("pause");//暫停 讓cmd窗口不消失 }
NOTE:函數裡面的變量x,y是局部變量和mian裡面的x,y是全局變量,當局部變量和全局變量重名時候,在局部變量作用域作用的是局部變量而不是全局變量