C++ (原始指標)

文章推薦指數: 80 %
投票人數:10人

的指標 void 只會指向原始記憶體位置。

有時候需要使用 void* 指標,例如在C++ 程式碼與C 函式之間傳遞時。

當具類型的指標 ... 跳到主要內容 已不再支援此瀏覽器。

請升級至MicrosoftEdge,以利用最新功能、安全性更新和技術支援。

下載MicrosoftEdge 其他資訊 目錄 結束焦點模式 語言 閱讀英文 儲存 目錄 閱讀英文 儲存 Twitter LinkedIn Facebook 電子郵件 目錄 C++(原始指標) 發行項 05/02/2022 2位參與者 本文內容 指標是變數的類型。

它會將物件的位址儲存在記憶體中,並用來存取該物件。

原始指標是一個指標,其存留期不受封裝物件控制,例如智慧型指標。

原始指標可以指派另一個非指標變數的位址,也可以指派的值nullptr。

尚未指派值的指標包含亂數據。

指標也可以被取值,以擷取其指向的物件值。

成員存取運算子提供物件成員的存取權。

int*p=nullptr;//declarepointerandinitializeit //sothatitdoesn'tstorearandomaddress inti=5; p=&i;//assignpointertoaddressofobject intj=*p;//dereferenceptoretrievethevalueatitsaddress 指標可以指向具型別物件或void。

當程式在記憶體中的堆積上設定物件時,它會以指標的形式接收該物件的位址。

這類指標稱為擁有指標。

擁有指標(或)的複本,必須用來在不再需要堆積設定物件時明確釋放堆積配置的物件。

無法釋放記憶體會導致記憶體流失,並轉譯電腦上任何其他程式無法使用的記憶體位置。

使用new配置的記憶體必須使用delete(或delete[])釋放。

如需詳細資訊,請參閱new和delete運算子。

MyClass*mc=newMyClass();//allocateobjectontheheap mc->print();//accessclassmember deletemc;//deleteobject(pleasedon'tforget!) 如果指標未宣告為const),指標(可以遞增或遞減,以指向記憶體中的其他位置。

此作業稱為指標算術。

它用於C樣式的程式設計,以逐一查看陣列或其他資料結構中的元素。

const指標無法指向不同的記憶體位置,而且該意義類似于參考。

如需詳細資訊,請參閱const和volatile指標。

//declareaC-stylestring.Compileraddsterminating'\0'. constchar*str="Helloworld"; constintc=1; constint*pconst=&c;//declareanon-constpointertoconstint constintc2=2; pconst=&c2;//OKpconstitselfisn'tconst constint*constpconst2=&c; //pconst2=&c2;//Error!pconst2isconst. 在64位作業系統上,指標的大小為64位。

系統的指標大小會決定它可以擁有多少可定址記憶體。

指標指向相同記憶體位置的所有複本。

(指標以及參考)在C++中廣泛使用,以在函式中傳遞較大的物件。

複製物件的位址比複製整個物件更有效率。

定義函式時,除非您想要修改物件,否則請將指標參數指定為const。

一般而言,除非物件的值可以是nullptr,const否則參考是將物件傳遞至函式的慣用方式。

函式的指標可讓函式傳遞至其他函式。

它們用於C樣式程式設計中的「回呼」。

新式C++會針對此目的使用Lambda運算式。

初始化和成員存取 下列範例示範如何宣告、初始化和使用原始指標。

它會使用new初始化,以指向配置在堆積上的物件,您必須明確指定delete這個物件。

此範例也會顯示一些與原始指標相關聯的危險。

(請記住,此範例是C樣式的程式設計,而不是新式C++!) #include #include classMyClass { public: intnum; std::stringname; voidprint(){std::cout<num=3; } //AcceptsaMyClassobject voidfunc_B(MyClassmc) { //mchereisaregularobject,notapointer. //Usethe"."operatortoaccessmembers. //Thisstatementmodifiesonlythelocalcopyofmc. mc.num=21; std::cout<operatortoaccesstheobject'spublicmembers pmc->print();//"Nick,108" //Copythepointer.Nowpmcandpmc2pointtosameobject! MyClass*pmc2=pmc; //Usecopiedpointertomodifytheoriginalobject pmc2->name="Erika"; pmc->print();//"Erika,108" pmc2->print();//"Erika,108" //Passthepointertoafunction. func_A(pmc); pmc->print();//"Erika,3" pmc2->print();//"Erika,3" //Dereferencethepointerandpassacopy //ofthepointed-toobjecttoafunction func_B(*pmc); pmc->print();//"Erika,3"(originalnotmodifiedbyfunction) delete(pmc);//don'tforgettogivememorybacktooperatingsystem! //delete(pmc2);//crash!memorylocationwasalreadydeleted } 指標算術和陣列 指標和陣列非常相關。

當陣列以值方式傳遞至函式時,它會當做第一個元素的指標傳遞。

下列範例示範指標和陣列的下列重要屬性: sizeof運算子會以位元組為單位傳回陣列的總大小 若要判斷元素數目,請將總位元組數除以一個元素的大小 當陣列傳遞至函式時,它會衰減為指標類型 sizeof當運算子套用至指標時,它會傳回指標大小,例如x86上的4個位元組或x64上的8個位元組 #include voidfunc(intarr[],intlength) { //returnspointersize.notusefulhere. size_ttest=sizeof(arr); for(inti=0;i #include usingnamespacestd; intmain() { BITMAPINFOHEADERheader; header.biHeight=100;//Multipleof4forsimplicity. header.biWidth=100; header.biBitCount=24; header.biPlanes=1; header.biCompression=BI_RGB; header.biSize=sizeof(BITMAPINFOHEADER); constexprintbufferSize=30000; unsignedchar*buffer=newunsignedchar[bufferSize]; BITMAPFILEHEADERbf; bf.bfType=0x4D42; bf.bfSize=header.biSize+14+bufferSize; bf.bfReserved1=0; bf.bfReserved2=0; bf.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);//54 //Createagraysquarewitha2-pixelwideoutline. unsignedchar*begin=&buffer[0]; unsignedchar*end=&buffer[0]+bufferSize; unsignedchar*p=begin; constexprintpixelWidth=3; constexprintborderWidth=2; while(pend-header.biWidth*pixelWidth*borderWidth) //Isleftorrightedge? ||(p-begin)%(header.biWidth*pixelWidth)((header.biWidth-borderWidth)*pixelWidth)) { *p=0x0;//Black } else { *p=0xC3;//Gray } p++;//Incrementonebytesizeof(unsignedchar). } ofstreamwf(R"(box.bmp)",ios::out|ios::binary); wf.write(reinterpret_cast(&bf),sizeof(bf)); wf.write(reinterpret_cast(&header),sizeof(header)); wf.write(reinterpret_cast(begin),bufferSize); delete[]buffer;//ReturnmemorytotheOS. wf.close(); } void*指標 的指標void只會指向原始記憶體位置。

有時候需要使用void*指標,例如在C++程式碼與C函式之間傳遞時。

當具類型的指標轉換成void指標時,記憶體位置的內容會保持不變。

不過,類型資訊會遺失,因此您無法執行遞增或遞減作業。

例如,可以轉換記憶體位置,例如,從MyClass*到void*,然後再轉換回MyClass*。

這類作業原本就容易發生錯誤,而且需要非常小心void錯誤。

新式C++在幾乎所有情況下都不建議使用void指標。

//func.c voidfunc(void*data,intlength) { char*c=(char*)(data); //fillinthebufferwithdata for(inti=0;i extern"C" { voidfunc(void*data,intlength); } classMyClass { public: intnum; std::stringname; voidprint(){std::cout<(mc); MyClass*mc2=static_cast(p); std::cout<name<<:endl delete void char>(pvoid); for(char*c=pchar;c(pvoid)[0]; std::cout< #include usingnamespacestd; stringbase{"helloworld"}; stringappend(strings) { returnbase.append("").append(s); } stringprepend(strings) { returns.append("").append(base); } stringcombine(strings,string(*g)(stringa)) { return(*g)(s); } intmain() { cout<



請為這篇文章評分?