C語言是面向過程的,而C++是面向?qū)ο蟮? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? C和C++的區(qū)別:
C是一個結(jié)構(gòu)化語言,它的重點在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計首要考慮的是如何通過一個過程,對輸入(或環(huán)境條件)進行運算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)。
C++,首要考慮的是如何構(gòu)造一個對象模型,讓這個模型能夠契合與之對應(yīng)的問題域,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設(shè)計這個概念已經(jīng)被融入到C++之中 ”。
C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設(shè)計這個概念已經(jīng)被融入到C++之中 ”,而就語言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,錯!算法是程序設(shè)計的基礎(chǔ),好的設(shè)計如果沒有好的算法,一樣不行。而且,“C加上好的設(shè)計”也能寫出非常好的東西。

一、結(jié)構(gòu)體與函數(shù)參數(shù)
結(jié)構(gòu)體作函數(shù)參數(shù)可分為傳值與傳指針。

小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 六九九,四七零,五九六 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!
1.傳值時結(jié)構(gòu)體參數(shù)會被拷貝一份,在函數(shù)體內(nèi)修改結(jié)構(gòu)體參數(shù)成員的值實際上是修改調(diào)用參數(shù)的一個臨時拷貝的成員的值,這不會影響到調(diào)用參數(shù)。在這種情況下,由于涉及到結(jié)構(gòu)體參數(shù)的拷貝,程序空間及時間效率都會受到影響,所以這種方法基本不用。
例如:
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;
void fun(STUDENT stu)
{
printf(“stu.name=%s,stu.age=%d/n”,stu.name,stu.age);
}
2.傳指針時直接將結(jié)構(gòu)體的首地址傳遞給函數(shù)體,在函數(shù)體中通過指針引用結(jié)構(gòu)體成員,可以對結(jié)構(gòu)體參數(shù)成員的值造成實際影響。這種用法效率高,經(jīng)常采用。
例如:
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;
void fun(STUDENT* pStu)
{
printf(“pStu->name=%s,pStu->age=%d/n”,pStu->name,pStu->age);
}
二、結(jié)構(gòu)體與函數(shù)返回值
對于某些版本的C語言編譯器,返回值僅能為基本數(shù)據(jù)類型如int、char以及指針,因此結(jié)構(gòu)體作為一種組合數(shù)據(jù)類型,不能以值的方式返回,而在有些版本的C編譯器中又可以直接返回結(jié)構(gòu)體變量 ,在C++中也是可以直接返回結(jié)構(gòu)體變量的。
直接返回結(jié)構(gòu)體變量示例如下;
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;
STUDENT fun();
int _tmain(int argc, _TCHAR* argv[])
{
STUDENT p=fun();
printf("p.name=%s",p.name);
return 0;
}
STUDENT fun()
{
STUDENT stu;
stu.age=18;
strcpy(stu.name,"xiaoming");
return stu;
}
以指針方式返回結(jié)構(gòu)體示例如下:
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;
STUDENT* fun()
{
STUDENT* p=malloc(sizeof(STUDENT));
p->age=18;
strcpy(p->name,"xiaoming");
return p;
}

小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 六九九,四七零,五九六 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!
關(guān)于結(jié)構(gòu)體中含有位域的問題:
C99規(guī)定int、unsigned int和bool可以作為位域類型,但編譯器幾乎都對此作了擴展,允許其它類型類型的存在。
使用位域的主要目的是壓縮存儲,其大致規(guī)則為:
1) 如果相鄰位域字段的類型相同,且其位寬之和小于類型的sizeof大小,則后面的字段將緊鄰前一個字段存儲,直到不能容納為止;
2) 如果相鄰位域字段的類型相同,但其位寬之和大于類型的sizeof大小,則后面的字段將從新的存儲單元開始,其偏移量為其類型大小的整數(shù)倍;
3) 如果相鄰的位域字段的類型不同,則各編譯器的具體實現(xiàn)有差異,VC6采取不壓縮方式,Dev-C++采取壓縮方式;
4) 如果位域字段之間穿插著非位域字段,則不進行壓縮;
5) 整個結(jié)構(gòu)體的總大小為最寬基本類型成員大小的整數(shù)倍。
還是讓我們來看看例子。
struct A{
char f1 : 3;
char f2 : 4;
char f3 : 5;
};
a b c
A的內(nèi)存布局:111, 1111 *, 11111 * * *
位域類型為char,第1個字節(jié)僅能容納下f1和f2,所以f2被壓縮到第1個字節(jié)中,而f3只能從下一個字節(jié)開始。因此sizeof(A)的結(jié)果為2。
struct B{
char f1 : 3;
short f2 : 4;
char f3 : 5;
};
由于相鄰位域類型不同,在VC6中其sizeof為6;
struct C{
char f1 : 3;
char f2;
char f3 : 5;
};
非位域字段穿插在其中,不會產(chǎn)生壓縮,在VC6中得到的大小均為3。

小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 六九九,四七零,五九六 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!
提示:
在設(shè)計結(jié)構(gòu)體的時候,一般會尊照一個習(xí)慣,就是把占用空間小的類型排在前面,占用空間大的類型排在后面,這樣可以相對節(jié)約一些對齊空間!
這些是C/C++能做的
服務(wù)器開發(fā)工程師、人工智能、云計算工程師、信息安全(黑客反黑客)、大數(shù)據(jù) 、數(shù)據(jù)平臺、嵌入式工程師、流媒體服務(wù)器、數(shù)據(jù)控解、圖像處理、音頻視頻開發(fā)工程師、游戲服務(wù)器、分布式系統(tǒng)、游戲輔助等



