C++ (原始指標)
文章推薦指數: 80 %
的指標 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
當陣列以值方式傳遞至函式時,它會當做第一個元素的指標傳遞。
下列範例示範指標和陣列的下列重要屬性:
sizeof運算子會以位元組為單位傳回陣列的總大小
若要判斷元素數目,請將總位元組數除以一個元素的大小
當陣列傳遞至函式時,它會衰減為指標類型
sizeof當運算子套用至指標時,它會傳回指標大小,例如x86上的4個位元組或x64上的8個位元組
#include
有時候需要使用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
延伸文章資訊
- 1指標與位址 - OpenHome.cc
int *n; float *s; char *c;. 雖然宣告指標時,C 習慣將 * 前置在變數名稱前,不過 n 的型態是 ...
- 2[C++, CPP 教學教程教材Tutorial] 指標(Pointer)&指涉器 ...
介紹C++的指標(Pointer), 指涉器(Reference), 取址運算子(Address-of ... 指標 :用來儲存記憶體位址的變數 ⇒ 所以初始化時只能指派位址給指標,而不是值; ...
- 3指標與位址 - OpenHome.cc
int *n; float *s; char *c;. 雖然宣告指標時,C++ 習慣將 * 前置在變數名稱前,不過 n 的型態是 ...
- 4(C) 簡單搞懂指標(pointer)、指標陣列(pointers of array, int *foo ...
a) *ptr++是表示*(ptr++)的意思,就是ptr指向下一個位置所存的值(同arr[i++])。 b)*++ptr是代表ptr先做位址往前移,再取值(同arr ...
- 5第5章、陣列和指標 - C/C++
但是有三種應用場合,使用指標仍然是必要的。第一是字串(string)的宣告;第二是動態記憶體配置(dynamic memory allocation);第三是函式的 ...