C 的點點滴滴

2021-04-01 20:19:28 字數 3714 閱讀 9963

函式傳值有三種方式:按值傳遞(pass-by-value),按位址傳遞(pass-by-address)和按引用傳遞(pass-by-reference)。不同的是,按值傳遞方式中,函式部分不能改變主函式中實參的值。而按位址傳遞和按引用傳遞均可以改變主函式中實參的值。

按值傳遞,實參和形參均為同一型別的物件。例如:

void f(int b)

int main()

按位址傳遞,實參為變數的位址,而形參為同型別的指標。

void f(int* b)

int main()

按引用傳遞,實參為變數,形參為同型別的引用。

void f(int& b)

int main()

在c++中,通過使用運算子new和delete可以進行記憶體空間的動態分配和釋放。比如給乙個double型別的指標進行記憶體空間的分配和釋放操作,可以採用下面的**:

double * pd; // 先定義指標變數

pd=new double; // 然後分配記憶體空間

if ( pd! = null)

如果需要分配和釋放的記憶體空間是乙個陣列,可以採用下面的**:

double * pds=new double[100]; // 定義指標變數並分配空間

if(pds != null)

注意,當需要釋放給乙個陣列分配的記憶體空間時,常常採用帶中括號[ ]的形式,這樣釋放得會更乾淨。而採用不帶中括號[ ]的方式,可能只釋放了一部分的記憶體空間。

如果使用new進行記憶體空間的分配沒有成功,則會返回空指標null。此外,在使用new的時候,記憶體的分配錯誤也可以被使用者定義的異常處理程式所捕獲。

使用new對記憶體的分配,可以先定義指標變數,然後為其分配記憶體空間(見前面的指標變數pd的使用方法)。或者在定義指標變數的同時進行記憶體空間的分配(見前面的指標變數pds的使用方法)。

引用作為函式引數

#include

using namespace std;

void f(int& r)

int main()

執行結果:

x = 47

&x = 0x22ff6c

r = 47

&r = 0x22ff6c

r = 5

x = 5

指標作為函式引數

指標作為函式引數

#include

using namespace std;

void f(int* p)

int main()

執行結果:

x = 47

&x = 0x22ff6c

p = 0x22ff6c

*p = 47

p = 0x22ff6c

x = 5

void 指標

void 指標

在c++語言中,關鍵字void的用法比較多。比如,在函式的原型(proto type)或定義(definition)處,如果在函式名前加乙個關鍵字void,則表示該函式沒有返回值,在函式體中退出時只要使用return語句,並且後面不帶返回值就可以了。如果在函式的引數列表中只有乙個關鍵字void,則表明該函式沒有引數。

void指標就是void型別的指標,即通用型別的指標。void指標在使用c++語言程式設計時使用範圍也比較廣,它指向乙個位址值,但不明確說明資料型別。可以使用void指標建立通用函式:只要將函式的形參設定為void指標,就可以為引數傳遞各種型別的指標了。

在使用void指標的時候,通常要將指標型別轉換為相應具體的資料型別。

下面的例程對void指標的定義和用法進行了具體說明。同時,本例程也可以作為乙個小工具,測試各種資料型別的數在記憶體中是如何放置、表現的,比如,整型數在記憶體中排放的

順序,是高位在前,還是高位在後;浮點數的16進製制格式又是什麼樣子的。#include

#include

#include

#include

#pragma hdrstop

#pragma argsused

void showhex(void *pv, int size)

cout

int main(int argc, char* argv)

執行結果

78 56 34 12

typeid運算子

可以使用typeid運算子來求得變數或物件的資料型別。typeid運算子對變數或資料型別作用後,將返回乙個type_info型別的物件,通過該物件,就可以獲取資料型別的名稱。type_info類一般在標頭檔案typeinfo.h中定義。在c++中,相應類的定義如下:

class type_info

;可以看到,通過type_info類的name成員函式就可以獲取指定變數或物件的資料型別。

下面通過例程s 0 2 h說明typeid的一些用法。

例程s 0 2 h的源**

#include

#include

#include

struct car // 定義結構c a r

;void main()

// 求兩個浮點數的最大值

double max( double x,double y)

void main()

執行結果:

int type:2

double type:5

。有興趣的讀者可以自己修改上面的例程,測試一下。

const型別成員函式與mutable

const型別的成員函式是指使用const關鍵字進行修飾的類的成員函式。const型別的成員函式對函式內部的操作加以一定的限制,比如不可以對物件的屬性進行修改等,這樣可以提高程式**的正確性。

在使用關鍵字const對成員函式修飾的時候,將const放在成員函式的後面。在定義物件的時候,可以使用關鍵字const宣告物件為常量物件。對於常量物件,如果使用非常量成員函式來操作,則會出現乙個編譯錯誤;同樣,對於使用關鍵字volatile宣告的物件,

如果使用非volatile型別的成員函式來操作,也會出現乙個編譯錯誤。

如果想修改const型別物件的成員變數,可以使用關鍵字mutable對該成員變數進行修飾。

#include

#include

class cdate

;int getmonth() const; // 乙個唯讀函式

void setmonth( int m ); // 乙個寫函式

};int cdate::getmonth() const

void cdate::setmonth(int m)

void main()

;rabbit::rabbit()

rabbit::~ rabbit()

int rabbit::getnum()

int rabbit::num=0; // 對靜態公有成員變數進行初始化

void main()

;book::book(int n)

book::~ book ( )

void add(book b) // 普通引數傳遞

void addref(book & b) // 引用引數傳遞

void main()

// 判斷兩個整數的最小值

int min(int x,int y)

{return x

C 點點滴滴 Enum

列舉是在寫程式的過程中經常會遇到的型別。對於enum,net提供了很多使用的方法 1.parse 將乙個或多個列舉常數的名稱或數字值的字串表示轉換成等效的列舉物件。msdn parse方法是經常會用到的乙個方法,它有兩個過載形式 public static object parse type enu...

acm 點點滴滴

qsort排序方法 六種qsort排序方法 本文中排序都是採用的從小到大排序 一 對int型別陣列排序 int num 100 sample int cmp const void a const void b qsort num,100,sizeof num 0 cmp 二 對char型別陣列排序 ...

sizeof 點點滴滴

1.靜態變數是存放在全域性資料區中的,sizeof計算棧中分配的大小,所以類或結構體中的靜態變數時不會計算在sizeof內的!2.sizeof和strlen的區別 1 sizeof操作符的結果型別是size t,它在標頭檔案中的typedef為unsigned int型別。該型別保證能容納實現所建立...