C與C 的區別

2021-04-08 22:43:09 字數 2101 閱讀 3447

1.void型指標

int *x = malloc(sizeof(int) * 10);在c裡面是合法的,但是在c++中編譯不通過。從bjarne stroustrup給出的解釋是這種型別是不安全的。就是說你可以使用乙個void型的指標指向任何位址,如果你分配了乙個位址給這個void指標指向另乙個與它型別不同的指標,完全沒有警告。

接著文章中又給出了乙個例子。 

int an_int;

void *void_pointer = &an_int;

double *double_ptr = void_pointer;

*double_ptr = 5;

當你分配了乙個*double_ptr的值為5時,它在記憶體中占有了8個位元組,但是int型的變數an_int只有四個位元組大小。

2.指向陣列的指標的分配和釋放:new and delete

在c中,只有主要的乙個記憶體分配函式:malloc。可以使用它給單個元素和陣列分配空間:

int *x = malloc( sizeof(int) );

int *x_array = malloc( sizeof(int) * 10 );

釋放資源:free( x );

free( x_array );

但是在c++中,對於陣列的記憶體分配與單個元素的分配不同,我們要是用new and delete

int *x = new int;

int *x_array = new int[10];

delete x;

delete x;

乙個簡短的解釋是,當你建立乙個陣列物件的時候,delete為陣列中的每乙個元素呼叫了析構函式,而delete並不這麼做。

3.函式要先申明然後才能呼叫。

儘管大多數的c**都遵從這個慣例,但是在c++中卻是嚴格要求函式必須在使用之前申明。下面給出了乙個在c中合法,但是在c++中非法的**。

#include

int main()

int foo()

4.在c中使用使用struct和enum

在c中我們必須要用關鍵字struct新增在用乙個結構體去申明乙個結構體物件的前面。在c++中我們可以使用如下**:

struct a_struct

;a_struct struct_instance;

這樣我們就獲得了乙個a_struct型別的例項struct_instance。而在c中,我們在申明乙個例項的時候,不得不多使用乙個struct關鍵字。struct a_struct struct_instance;

事實上,在申明enum的時候也有乙個相似的情形:在c中,我們也不得不多使用關鍵字enum去申明乙個enum型別的例項。而c++中不需要這麼做。作為乙個注意點,大部分的c程式設計師都習慣使用typedef

typedef struct struct_name

struct_name_t;

然後就可以用如下方式申明乙個物件了

struct_name_t struct_name_t_instance;

但是有另乙個應該告訴c++程式設計師的是:你仍然要使用struct struct_name這種語法來申明乙個struct成員,相當於指向結構體得指標。(意思是說在乙個結構體中申明乙個另乙個結構體的物件)

typedef struct struct_name

struct_name_t;

5.c++有乙個更大的庫

c++比c有乙個大的多的庫,而且當他們不是用c的時候會通過c++鏈結到別的地方。例如,如果你習慣於用g++來處理需要大量資料處理的話,當你使用gcc去編譯c的時候,你就很吃驚的發現出現了上述的情況,你需要顯示的包含math這個庫來處理諸如sin 或者甚至sqrt:

% g++ foo.cc

or% gcc foo.c -lm

6.沒有布林型別

c中沒有提供乙個本地的布林類想。然而你可以使用enum來模仿乙個布林型別

typedef enum bool;

7.main函式不會自動提供0作為返回值(return 0)

在c++中,你可以在main函式的末尾隨便的丟掉return 0,這條語句,它會被自動的提供。

int main()

但是在c中,你必須手動的新增:return 0

int main()

C 與C的區別

l c如果不寫返回值,預設是int,而c 中不能不寫返回值 可用void表示無返回值 如func1 l int func1 在c中表示可帶任意引數的函式,這是c的漏洞,使得它避開了引數型別檢查 而c 中表示不帶引數的函式。2 標頭檔案的區別 l c 的標頭檔案去掉了c中的.h,以c字首開始。比如,變...

C與C 的區別

在很大程度上,標準c 是標準c的超集.實際上,所有c程式也是c 程式,然而,兩者之間有少量區別.下面簡要介紹一下最重要的區別.在c 中,民,區域性變數可以在乙個程式塊內在任何地方宣告,在c中,區域性變數必須在程式塊的開始部分,即在所有 操作 語句之前宣告,請注意,c99標準中取消了這種限制.在c中,...

C與C 的區別

在很大程度上,標準c 是標準c的超集.實際上,所有c程式也是c 程式,然而,兩者之間有少量區別.下面簡要介紹一下最重要的區別.在c 中,區域性變數可以在乙個程式塊內在任何地方宣告,在c中,區域性變數必須在程式塊的開始部分,即在所有 操作 語句之前宣告,請注意,c99標準中取消了這種限制.在c中,按如...