2016/12/21

C++ 指標

前言:
只要是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的記憶體位址值:0x7fff5ce8eacc
0x7fff5ce8eacc記憶體的值為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

參考資料

沒有留言:

張貼留言