//類似於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">#include
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);
}
在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">#include
int 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">#include
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窗口不消失
}
指針原理圖:

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是全局變量,當局部變量和全局變量重名時候,在局部變量作用域作用的是局部變量而不是全局變量