只要是c++有關於指標的都會記錄在這裡,不定期新增內容。
C++中,利用&,「取址運算子」,可以取出變數記憶體的位址值。
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char** argv) { int a=10; cout<<"a的值:"<<a<<endl; cout<<"a的記憶體位址值:"<<&a<<endl; }執行結果:
a的值:10 a的記憶體位址值:0x7fff5ce8eacc0x7fff5ce8eacc記憶體的值為16進位表示法。
而指標用來儲存記憶體位址值,或者說,指向記憶體位址,而不直接操作變數或物件。
下面是一個整數指標的宣告:
int *ptr;
int是這個指標要儲存指向變數的資料型態、ptr是變數名稱
這樣宣告也可以:
int* ptr;
*靠著int
一次宣告多個指標:
int *ptr1,*ptr2;
其他形態的指標:
char *ctr;
float *ftr;
可用&運算子取出位址,並指定給指標:
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char** argv) { int a=10; int *ptr=&a; cout<<"a的位址:"<<&a<<endl; cout<<"指標ptr指向的址值:"<<ptr<<endl; }輸出結果:
a的位址:0x7fff4fc9eacc 指標ptr指向的址值:0x7fff4fc9eacc
如此,ptr儲存的值就是a的記憶體位址。 指標的*,叫「提取運算子」,可以取出指標指向的變數或物件的資料內容。
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char** argv) { int a=10; int *ptr=&a; cout<<"指標ptr儲存的位址:"<<ptr<<endl; cout<<"指標ptr指向的記憶體資料內容:"<<*ptr<<endl; }執行結果:
指標ptr儲存的位址:0x7fff5c6ddacc 指標ptr指向的記憶體資料內容:10
如果已經取得了記憶體位置,當將某個值指定給*ptr時,該記憶體位置的值也會跟著改變,相當於告訴程式,將值放到ptr所指向的記憶體位址,例如:
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char** argv) { int a=10; int *ptr=&a; cout<<"a="<<a<<endl; cout<<"*ptr="<<*ptr<<endl; *ptr=20; cout<<"a="<<a<<endl; cout<<"*ptr="<<*ptr<<endl; }執行結果:
a=10 *ptr=10 a=20 *ptr=20要給沒值的指標初值:
int *ptr=0;
可用void關鍵字,這樣可不存值,只存記憶體位址。
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char** argv) { int var = 10; void *vptr = &var ; // 下面這句不可行,void型態指標不可取值 //cout << *vptr << endl; // 轉型為int型態指標並指定給iptr int *iptr = reinterpret_cast<int*>(vptr); cout << *iptr << endl; return 0; }void型態的指標沒任何型態資訊,只能存記憶體位址,所以不能用*取值,要用reinterpret_cast轉到對應的型態。 執行結果:
10
參考資料
沒有留言:
張貼留言