C語言是面向過程的浮声,而C++是面向?qū)ο蟮?/b>
C和C++的區(qū)別:
C是一個結構化語言虚婿,它的重點在于算法和數(shù)據(jù)結構。C程序的設計首要考慮的是如何通過一個過程泳挥,對輸入(或環(huán)境條件)進行運算處理得到輸出(或?qū)崿F(xiàn)過程(事務)控制)然痊。
C++,首要考慮的是如何構造一個對象模型屉符,讓這個模型能夠契合與之對應的問題域剧浸,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務)控制。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣矗钟。之所以說C++比C更先進辛蚊,是因為“ 設計這個概念已經(jīng)被融入到C++之中 ”。
C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣真仲。之所以說C++比C更先進袋马,是因為“ 設計這個概念已經(jīng)被融入到C++之中 ”,而就語言本身而言秸应,在C中更多的是算法的概念虑凛。那么是不是C就不重要了碑宴,錯!算法是程序設計的基礎桑谍,好的設計如果沒有好的算法延柠,一樣不行。而且锣披,“C加上好的設計”也能寫出非常好的東西贞间。
- Hello,C
//類似于java import 引入頭文件
int main() {
printf("Hello,C ");//輸入語句
// 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 ");//輸入語句
// system("pause");//暫停 讓cmd窗口不消失
return 0;
}
小編推薦一個學C語言/C++的學習裙【 六九九,四七零雹仿,五九六 】增热,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習胧辽!裙內(nèi)有開發(fā)工具峻仇,很多干貨和技術資料分享!
第一個沒啥好講的,include類似JAVA的import導包操作,以前學習C的之后一直寫#include< stdio.h>老師也沒說,不知道是個啥!現(xiàn)在才恍然明白原來是standard i/o的意思.默認是有一個返回值的(void也是可以的,但是C++好像就強制要求要返回值),一般return 0;作為程序的正常結束邑商。
- c的基本數(shù)據(jù)類型和變量的定義
int main(){
//基本數(shù)據(jù)類型 字符型 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 ",i);
}
" data-snippet-id="ext.ee2a10fe64308b41bbcc87f7e41ff8fb" data-snippet-saved="false" data-codota-status="done">#includeint main(){
//基本數(shù)據(jù)類型 字符型 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 ",i);
}
在C中變量需要先定義后使用,不能像java一樣,在哪里需要就直接 int i=0;在C中是行不通的.
常用數(shù)據(jù)類型長度在32 位的系統(tǒng)上
short 出來的內(nèi)存大小是2 個byte摄咆;
int 出來的內(nèi)存大小是4 個byte;
long 出來的內(nèi)存大小是4 個byte人断;
float 出來的內(nèi)存大小是4 個byte吭从;
double 出來的內(nèi)存大小是8 個byte;
char 出來的內(nèi)存大小是1 個byte恶迈。
(具體長度和平臺有關,可以用sizeof 方法測試一下)
輸出時不同輸出格式都有那些呢?
(1)d(或i)格式符影锈。用來輸出十進制整數(shù),有以下幾種用法:
??①%d蝉绷,按整型數(shù)據(jù)的實際長度輸出鸭廷。
??②%md,m為指定的輸出字段的寬度熔吗。如果數(shù)據(jù)的位數(shù)小于m辆床,
?? 則左端補以空格,若大于m桅狠,則按實際位數(shù)輸出讼载。
?? ③%ld(%mld 也可),輸出長整型數(shù)據(jù)中跌。
??例如:long a=123456;
?? printf(“%ld”,a);
(2)o格式符咨堤,以八進制數(shù)形式輸出整數(shù)。格式:%o漩符,%mo,%lo一喘,%mlo都可。
(3)x(或X)格式符,以十六進制數(shù)形式輸出整數(shù)凸克。格式:%x议蟆,%mx,%lx,%mlx都可萎战。
(4)u格式符咐容,用來輸出unsigned型數(shù)據(jù),即無符號數(shù)蚂维,以十進制數(shù)形式輸出戳粒。
格式:%u,%mu,%lu都可虫啥。
(5)c格式符蔚约,用來輸出一個字符。格式:%c孝鹊,%mc都可。
(6)s格式符展蒂,用來輸出一個字符串又活。格式:%s,%ms,%-ms锰悼,%m.ns柳骄,%-m.ns都可。
(7)f格式符箕般,用來輸出實數(shù)(包括單耐薯、雙精度),以小數(shù)形式輸出丝里。格式:%f曲初,%m.nf,%-m.nf都可杯聚。
注意:單精度實數(shù)的有效位數(shù)一般為7位臼婆,雙精度為16位。
(8)e(或E)格式符幌绍,以指數(shù)形式輸出實數(shù)颁褂。格式:%e,%m.ne傀广,%-m.ne都可颁独。
(9)g(或G)格式符,用來輸出實數(shù)伪冰,它根據(jù)數(shù)值的大小誓酒,自動選f格式或e格式(選擇輸出時占寬度較小的一種)。
- 循環(huán)語句for
int main() {
//c99標準
int i;
for(i = 0; i<100; i++) {
printf(" i = %d ",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 ",i);
}
system("pause");//暫停 讓cmd窗口不消失
}
這個java的區(qū)別就在于,java可以在任何需要的地方直接創(chuàng)建個變量,for一般寫成
for(int i = 0; i<100; i++) {
}
C則需要先聲明變量.下面是常見的語句
- 指針變量
int main() {
int* p;//定義一個int*類型的指針變量 p
int i = 10;//定義一個int類型的變量 i i就有一個內(nèi)存地址值
//指針賦值 &就是取內(nèi)存地址,將i的地址賦值給p
p = &i;
printf("i = %d ",i);//直接獲取i的值 *:獲取指針變量指向的值
printf("通過指針對象去獲取 i = %d ",*p);
printf("指針變量p = %d ",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就有一個內(nèi)存地址值
//指針賦值 &就是取內(nèi)存地址,將i的地址賦值給p
p = &i;
printf("i = %d ",i);//直接獲取i的值 *:獲取指針變量指向的值
printf("通過指針對象去獲取 i = %d ",*p);
printf("指針變量p = %d ",p);
//重點: 特殊: * &
//1 怎么定義指針變量 類型* 變量名;
//2 怎么賦值 p = &i;
//3 怎么拿值 int i = *p;
system("pause");//暫停 讓cmd窗口不消失
}
指針原理圖:
Note:需要注意的是,指針*p在左與在右的區(qū)別:
int i = 0;
int *p = &i;
int j = *p; // *p出現(xiàn)在右邊,表示p指向的int型變量的值
*p = 2; // *p出現(xiàn)在左邊,表示p指向int型變量的內(nèi)存空間
- 多級指針
//類似于java import 引入頭文件
int main() {
//typedef int** pi;//聲明新的數(shù)據(jù)類型,代替了int** 數(shù)據(jù)類型,類似取別名
//定義多級指針
int i = 10;
int* p = &i;
int** q = &p;
int*** r = &q;
//通過r獲取i的值
printf("i = %d ",***r);
//通過q獲取i的值
printf("i = %d ",**q);
//通過p獲取i的值
printf("i = %d ",*p);
//規(guī)律:看前面的*號 數(shù)量 贮聂,取值的時候丰捷,有多少個*坯墨,取值的時候就用多少個*號
system("pause");//暫停 讓cmd窗口不消失
}" data-snippet-id="ext.c5a6bac3333814ce10e96ddad84384c2" data-snippet-saved="false" data-codota-status="done">#include//類似于java import 引入頭文件
int main() {
//typedef int** pi;//聲明新的數(shù)據(jù)類型,代替了int** 數(shù)據(jù)類型,類似取別名
//定義多級指針
int i = 10;
int* p = &i;
int** q = &p;
int*** r = &q;
//通過r獲取i的值
printf("i = %d ",***r);
//通過q獲取i的值
printf("i = %d ",**q);
//通過p獲取i的值
printf("i = %d ",*p);
//規(guī)律:看前面的*號 數(shù)量 ,取值的時候病往,有多少個*捣染,取值的時候就用多少個*號
system("pause");//暫停 讓cmd窗口不消失
}
多級指針在使用的時候并沒有和一級指針有太多的區(qū)別,其實就是二級指針就是指向一級指針地址的指針,三級指針就是指向二級指針地址的指針,類推
- 數(shù)組
數(shù)組簡單來說就是存放指定數(shù)據(jù)類型的一種數(shù)據(jù)結構.
他是一種指針類型的變量.直接使用指針變量arr,默認是指向數(shù)組的首地址
下面是一個int型的數(shù)組的賦值與取值操作:
//類似于java import 引入頭文件
int main() {
//定義數(shù)組
int arr[10];
int i;
//循環(huán)賦值
for(i = 0; i<10; i++) {
arr[i] = i;
}
//循環(huán)輸出 倒著輸出
for(i=9; i>=0; i--) {
printf("arr[%d] = %d ",i,arr[i]);
}
system("pause");//暫停 讓cmd窗口不消失
}" data-snippet-id="ext.12e8ab2bd279bd8cc10170c9ee323773" data-snippet-saved="false" data-codota-status="done">#include//類似于java import 引入頭文件
int main() {
//定義數(shù)組
int arr[10];
int i;
//循環(huán)賦值
for(i = 0; i<10; i++) {
arr[i] = i;
}
//循環(huán)輸出 倒著輸出
for(i=9; i>=0; i--) {
printf("arr[%d] = %d ",i,arr[i]);
}
system("pause");//暫停 讓cmd窗口不消失
}
小編推薦一個學C語言/C++的學習裙【 六九九,四七零停巷,五九六 】耍攘,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習畔勤!裙內(nèi)有開發(fā)工具蕾各,很多干貨和技術資料分享!
因為數(shù)組是一個指針類型的變量,默認指向首地址,我們可以通過指針變量指向地址的偏移來取數(shù)組指定位置的值,需要注意的是不同數(shù)據(jù)類型的偏移量,如:<喎?"/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 ",i,*(arr+i));//指針變量偏移再取值 }
- 結構體
學了java回頭看C語言的結構體(或者說是結構),就感覺特別親切,因為他和類特別像,大概結構體的設計就有面向?qū)ο缶幊痰乃枷朐诶锩?/p>
//定義結構體
struct person {
int age;
};
int main() {
struct person p;//定義一個結構變量
//給結構體里面的屬性賦值
p.age = 18;
printf("p.age = %d ",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 ",p.age);
system("pause");//暫停 讓cmd窗口不消失
}
需要注意的是定義結構體的關鍵字struct,還有就是結構體應該在開始的時候聲明,結構體名的書寫C里面一般都是小寫,而不是像java一樣類名開頭要大寫,當然這是編寫習慣,大寫也不會提示錯誤
- 結構體指針變量
//類似于java import 引入頭文件
//定義結構
struct person {
int age;
} *p; //定義了一個結構體指針變量
int main() {
//動態(tài)申請內(nèi)存
p = (struct person*)malloc(sizeof(struct person));
/*
//賦值
(*p).age = 21;//James
//輸出
printf("p.age = %d ",(*p).age);
*/
p->age = 2;
printf("p->age = %d ",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() {
//動態(tài)申請內(nèi)存
p = (struct person*)malloc(sizeof(struct person));
/*
//賦值
(*p).age = 21;//James
//輸出
printf("p.age = %d ",(*p).age);
*/
p->age = 2;
printf("p->age = %d ",p->age);
system("pause");//暫停 讓cmd窗口不消失
}
需要注意的是*p一開始并沒分配內(nèi)存,就類似java的一個變量,只是聲明了并沒有做new的操作,所以我們要new一下,調(diào)用C的分配內(nèi)存的方法給p分配一個person數(shù)據(jù)類型大小的內(nèi)存,并把p強轉為person類型
p = (struct person*)malloc(sizeof(struct person));
在上面我們看到兩種給結構體變量賦值的方式,這并沒有好壞自分,看個人習慣
方式一:(*p).age = 21;//James
*p表示數(shù)據(jù)類型person,這類似java里面 類名.數(shù)據(jù)類型
方式二:p->age = 2;//James
p表示指針,p->則指向這個數(shù)據(jù)類型age的地址
- 函數(shù)
//聲明一個函數(shù)
int add(int x,int y);
int main() {
int x = 1,y = 1;
//使用函數(shù)
int z = add(x,y);
printf(" x + y = %d ",z);
system("pause");//暫停 讓cmd窗口不消失
}
//實現(xiàn)函數(shù)
add(int x,int y) {
return x + y;
}" data-snippet-id="ext.803a7d9dff5358b0e7d8a459a77be2f2" data-snippet-saved="false" data-codota-status="done">#include//聲明一個函數(shù)
int add(int x,int y);
int main() {
int x = 1,y = 1;
//使用函數(shù)
int z = add(x,y);
printf(" x + y = %d ",z);
system("pause");//暫停 讓cmd窗口不消失
}
//實現(xiàn)函數(shù)
add(int x,int y) {
return x + y;
}
在C里面函數(shù)需要在開始的時候先聲明,當然你在生命的時候?qū)崿F(xiàn)也是可以的,但是并不推薦這樣做
//聲明并實現(xiàn)一個函數(shù),不推薦
int add(int x,int y) {
return x + y;
}
int main() {
int x = 1,y = 1;
//使用函數(shù)
int z = add(x,y);
printf(" x + y = %d ",z);
system("pause");//暫停 讓cmd窗口不消失
}" data-snippet-id="ext.8f8fada690b48a9c13afd0279bc0899c" data-snippet-saved="false" data-codota-status="done">#include//聲明并實現(xiàn)一個函數(shù),不推薦
int add(int x,int y) {
return x + y;
}
int main() {
int x = 1,y = 1;
//使用函數(shù)
int z = add(x,y);
printf(" x + y = %d ",z);
system("pause");//暫停 讓cmd窗口不消失
}
NOTE:函數(shù)里面的變量x,y是局部變量和mian里面的x,y是全局變量,當局部變量和全局變量重名時候,在局部變量作用域作用的是局部變量而不是全局變量
我們來舉個例子:
void swap(int x,int y) {
int temp = x;
x = y;
y = temp;
printf("交換之中 ");
printf(" x = %d ",x);
printf(" y = %d ",y);
}
int main() {
int x = 1;
int y = 2;
printf("交換之前 ");
printf(" x = %d ",x);
printf(" y = %d ",y);
swap(x,y);
printf("交換之后 ");
printf(" x = %d ",x);
printf(" y = %d ",y);
system("pause");//暫停 讓cmd窗口不消失
}
" data-snippet-id="ext.938d608d1a2c4452fd8c56aca844d1e3" data-snippet-saved="false" data-codota-status="done">#includevoid swap(int x,int y) {
int temp = x;
x = y;
y = temp;
printf("交換之中 ");
printf(" x = %d ",x);
printf(" y = %d ",y);
}
int main() {
int x = 1;
int y = 2;
printf("交換之前 ");
printf(" x = %d ",x);
printf(" y = %d ",y);
swap(x,y);
printf("交換之后 ");
printf(" x = %d ",x);
printf(" y = %d ",y);
system("pause");//暫停 讓cmd窗口不消失
}
執(zhí)行結果:
小編推薦一個學C語言/C++的學習裙【 六九九庆揪,四七零式曲,五九六 】,無論你是大牛還是小白缸榛,是想轉行還是想入行都可以來了解一起進步一起學習吝羞!裙內(nèi)有開發(fā)工具,很多干貨和技術資料分享内颗!
我們清楚的可以看到,實際交換值得是局部變量x,y,全局變量x,y的值并沒有改變.
那我們要交換連個數(shù)的值怎么辦呢?
//void swap(int x,int y) {
// int temp = x;
// x = y;
// y = temp;
// printf("交換之中 ");
// printf(" x = %d ",x);
// printf(" y = %d ",y);
//}
void swap(int* px,int* py) {
int temp = *px;
*px = *py;
*py = temp;
};
int main() {
int x = 1;
int y = 2;
printf("交換之前 ");
printf(" x = %d ",x);
printf(" y = %d ",y);
swap(&x,&y);
printf("交換之后 ");
printf(" x = %d ",x);
printf(" y = %d ",y);
system("pause");//暫停 讓cmd窗口不消失
}
" data-snippet-id="ext.dc28d5cce7118561d1e816cb5af4d85a" data-snippet-saved="false" data-codota-status="done">#include//void swap(int x,int y) {
// int temp = x;
// x = y;
// y = temp;
// printf("交換之中 ");
// printf(" x = %d ",x);
// printf(" y = %d ",y);
//}
void swap(int* px,int* py) {
int temp = *px;
*px = *py;
*py = temp;
};
int main() {
int x = 1;
int y = 2;
printf("交換之前 ");
printf(" x = %d ",x);
printf(" y = %d ",y);
swap(&x,&y);
printf("交換之后 ");
printf(" x = %d ",x);
printf(" y = %d ",y);
system("pause");//暫停 讓cmd窗口不消失
}
我們需要用指針來交換,我們傳入全局變量x,y的地址,交換x,y的地址,達到數(shù)據(jù)交換的結果,其實交換的不是數(shù)據(jù),而是x,y的地址
NOTE:在C里面并不支持方法的重載,也就是說,不能有兩個方法的名字是一樣的
- 函數(shù)指針
//聲明一個函數(shù)
int add(int x,int y);
int main() {
//定義一個函數(shù)指針
int (*fp)(int,int);
//給函數(shù)指針賦值
fp = add;
//函數(shù)指針的使用
int i = 1,j = 2;
int z = fp(i,j);
printf("i + j = %d ",z);
system("pause");//暫停 讓cmd窗口不消失
}
//實現(xiàn)函數(shù)
add(int x,int y) {
return x + y;
}" data-snippet-id="ext.68828294814c04f5833bacac36200def" data-snippet-saved="false" data-codota-status="done">#include//聲明一個函數(shù)
int add(int x,int y);
int main() {
//定義一個函數(shù)指針
int (*fp)(int,int);
//給函數(shù)指針賦值
fp = add;
//函數(shù)指針的使用
int i = 1,j = 2;
int z = fp(i,j);
printf("i + j = %d ",z);
system("pause");//暫停 讓cmd窗口不消失
}
//實現(xiàn)函數(shù)
add(int x,int y) {
return x + y;
}
我們在開始的地方聲明了一個add方法,并在后面實現(xiàn)了這個函數(shù),我們在main里面第一了一個傳參類型為兩個int的函數(shù)指針fq,然后將fq指向了add函數(shù)的地址在后面我們使用fq就和add的效果一樣了.因為他們指向的都是同一個內(nèi)存地址
- 結構體中的函數(shù)指針
#include//實現(xiàn)函數(shù)
int fun(int x,int y);
struct person {
int age;
//函數(shù)指針
int (*add)(int,int);
};
int main() {
//定義一個結構體指針
struct person* p = (struct person*)malloc(sizeof(struct person));
//給函數(shù)指針賦值
p->add = fun;
int x = 3,y = 1;
//通過一個函數(shù) 一個一個屬性賦值
p->age = p->add(x,y);
printf("p->age = %d ",p->age);
system("pause");//暫停 讓cmd窗口不消失
}
int fun(int x,int y) {
return x + y;
}
我們在開始的地方聲明一個fun函數(shù),并在后面實現(xiàn)了它,我們創(chuàng)建了一個結構體person,并定義了一個指針*p,為他分配了person大小的內(nèi)存,并把它強轉為person,我們將person中的函數(shù)指針add指向了函數(shù)fun,在后面我們?yōu)檫@個add函數(shù)傳入了參數(shù),并把指針p的age的地址指向了函數(shù)的返回值钧排。