只要是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
參考資料
沒有留言:
張貼留言