C 和C之間的區別

2021-09-26 23:09:51 字數 2648 閱讀 7916

c++和c語言之間存在多種不同點,這裡對它們之間的不同點進行總結。

(一) const修飾的量

a. c中const修飾的量叫常變數,不是常量,不能被修改。不是必須初始化,但是如果不初始化,之後無法賦予合適的值,因此一般進行初始化。

例:const int a=10;

int arr[a]=; //error a為常變數

其中常變數與普通變數的唯一區別是常變數定義以後,不能作為左值存在。

例: const int a=10;

int*p=(int *)&a;

*p=30;//true

a=10;//error,a為常變數,不能被修改,不能作為左值存在

b. c++中const修飾的量成為常量,必須初始化。(const編譯規則:所有適用常量名字的地方全部替換成常量的初始值)當c++中的常量引用乙個編譯階段不明確的值的時候退化成常變數。

例:int b=20;

const int a=b;//此時a為常變數,編譯階段值不明確

int arr[a]=;//error

引用外部const定義的常量時,在const常量定義處加extern使其生成的符號為global,可供外部檔案引用,因為const修飾的常量生成的符號為local,只能在本檔案中可見。

(二)c++中引用與c中指標

a. c++中引用必須初始化,初始化的值必須要能取位址, 例:int &a=10;//錯誤,但是不分配儲存空間。c中指標不宣告時初始化,在初始化的時候需要分配儲存空間。引用相對於指標更加安全,因為指標可指向任意一塊記憶體,可以改變所指的對。

b. 定義引用變數開闢記憶體,用於儲存引用的變數的位址,訪問引用變數,永遠訪問的是他所引用的記憶體,但無法訪問定義引用變數系統開闢的用於記錄所引用記憶體位址的對應位元組的記憶體,一經定義不能被更改。

c. 引用的大小根據所引用的型別確定,指標的大小由編譯器位數以及作業系統位數確定

d. 指標使用時必須解引用,並且可以多級引用。

e. 在組合語言中,定義乙個指標和引用相同,將變數的位址移入eax暫存器中,再將變數的位址存放在b或者p中,儲存變數的位址。

f. 指標可以指向空值。

例1: int  a=10;    //定義整型常量a

int *p=&a; //定義整型指標

b=20; //引用變數賦值

*p=20; //指標變數

例2:float a=10.5;

int b1=(int)a;

int b2=(int)&a;

int b3=(int &)a;

(三)static關鍵字

在非類中:

a. static修飾的全域性變數表示靜態全域性變數,已經初始化的放在 .data段 ,未初始化的放在 .bss段內,初始化的時候自動初始化為0,並且只在定義它的檔案中可見,其他檔案無法訪問該變數。

b. static修飾的區域性變數整個程序生命週期都存在,程式結束時釋放。每次呼叫這個變數時,其初始值都是上一次呼叫時修改的結果。

在類中:

c. static除了用來修飾區域性靜態變數和外部靜態變數、函式以外,還可以用來定義類的成員變數和函式。即靜態資料成員和靜態成員函式。其中所有物件共享資料成員或者成員函式。static關鍵字只能用於類內部的宣告,不能用於類外部的定義。

d .static成員函式沒有this形參(因為不屬於某個物件),可以直接訪問static資料成員,不能直接使用非static成員。

e.static成員函式不能宣告為const,因為const成員函式真正的含義是不修改該成員函式所屬的物件,而static成員函式不屬於任何物件。static成員函式不能宣告為虛函式!

f. static不是物件的組成部分,只是類的組成部分

g. c中static用來修飾區域性靜態變數和外部靜態變數、函式

(四)動態記憶體的開闢c中malloc和c++中new

a. c中開闢動態記憶體malloc與free搭配使用,釋放記憶體。

b. c++中new與delete同時使用,new呼叫malloc,相對於malloc,new除了有開闢記憶體的功能,還有初始化的功能對於內建型別,呼叫建構函式對於自定義函式。

c. delete不同於free,先進行析構,在free釋放記憶體。

例:  int *p=(int *)malloc(sizeof(int));

free(p);

int *p=new int(10);

delete p;

int *p=(int *)malloc(sizeof(int)*100);

free(p);

int *p=new int[100]; //開闢長度為100的陣列

delete p;

例:動態開闢3*4二維陣列

int **p=new int *[3];

for(int i=0;i<3;++i)

for(int i=0;i<3;++i)

delete p;

// int **p=new int[3][4]; //error 無法從「int (*)[4]」轉化為「int **」

C和C 結構struct之間的區別

在c 中,struct和class完全相同,除了struct預設為public和class預設為privacy 結構內部的成員函式 c中結構內部不能有成員函式,c 可以 c結構中不能直接初始化成員,c 中可以 c 中宣告結構變數時,不一定需要在前面加上struct關鍵字 c結構不能具有靜態成員,c ...

C語言和C 區別 C和C 之間互相呼叫

為了描述清楚c和c 之間區別,我們先建立兩個原始檔.c和.cpp c檔案 cpp檔案 執行出來結果如圖 會出現錯誤,無法解析的外部符號,在main中引用 為什麼呢?因為在.cpp檔案中,sum函式宣告是對函式的引用,生成的符號是 und 的,產生的符號是 的,在 檔案中,是在 段,生成的符號是 兩個...

C 中結構和類之間的區別

在使用類的時候,若需要錄入的資料過多,就會進行很多的宣告,占用記憶體較大,為了優化減少記憶體,我們可以使用結構 struct 來達到減少記憶體的目的 結構是我們自己定義的一種複雜的型別,是一種可封裝資料和相關功能的值型別,區別於常見的型別 int,string,double,bool 結構可以一次宣...