取地址與解引用
一般來說,我們有一個取地址符 &
可以返回該變數的地址.
int main(){
int a;
cout<<&a;
}
0x6ffe1c
如果我們現在有一個地址,我們還可以對它進行解引用 *
,來返回這個地址上的值.
int main(){
int a=5;
cout<<&a<<endl;
cout<<*(&a);
}
0x6ffe1c
5
從這裡可以看出,取地址與解引用是互為逆運算的.
指標變數即是儲存地址的變數,它的型別取決於它指向的變數是什麼.
顯然,一個變數和它的指標變數間的轉化,就是透過取地址與解引用這兩個操作.
int main(){
int a=5;
int* p=&a;
cout<<p<<endl;
a=*p;
cout<<a<<endl;
}
0x6ffe1c
5
小敘 對於指標變數的定義
指標變數定義時的 *
是跟著變數名的,也就是說,如果你使用
int* a,b,c;
你只會定義一個指標變數和兩個整型變數.
此外,你可以透過給指標賦地址和給指標的解引用賦正常值兩種辦法來賦值.
int main(){
int a=5;
int *p1,*p2;
*p1=a;
p2=&a;
}
箭頭取地址符
假設我們有這麼一個結構體
int main(){
struct hdk{
int a,b;
};
hdk *p=;
}
那麼我們想呼叫這個結構體裡的變數,恐怕就要這麼寫了:
(*p).a=1;
因此,箭頭符號應運而生
p->a=1;
我們還可以直接用指標變數直接儲存值.
int main(){
struct hdk{
int a,b;
};
hdk *p;
*p=hdk{1,2};
cout<<p->a<<" "<<p->b;
}
陣列指標與指標的運算
當一個指標被定義在陣列中時,它就具有了運算的意義. 一般我們使用的有加法和減法,在指標中分別用來表示上一位和下一位.
int main(){
int a[5]={1,2,3,4,5};
int *p=a;
for(int i=1;i<=5;++i){
cout<<*p<<" ";
p++;
}
}
1 2 3 4 5
另外地,還有指標與指標的減法,可以用來獲取兩個指標間的距離.
int main(){
int a[5]={1,2,3,4,5};
int *p=a,*p0=a;
for(int i=1;i<=5;++i){
p++;
}
cout<<p-p0<<" "<<p0-p<<endl;
}
5 -5
迭代器
迭代器的本質也是指標,不過是stl的指標.
定義方法:STL型別 ::iterator
int main(){
vector<int> a{1,2,3,4,5};
vector<int>::iterator p;
for(p=a.begin();p!=a.end();++p){
cout<<*p<<" ";
}
}
1 2 3 4 5
值得一提的是,.begin()
與 .end()
也是指標,一個是容器第一個數的地址,一個是最後一個數的下一個地址.
函式指標
假如幾個函式引數相同,就可以透過函式指標替換.
以兩個 (int,int) 函式為例.
int(*hdk)(int,int);
int test1(int a,int b){return a+b;}
int test2(int c,int d){return c*d;}
int main(){
int x,y;
cin>>x>>y;
if(x>0){
hdk=test1;
}
else{
hdk=test2;
}
cout<<hdk(x,y);
}
指標批次申請與指標的刪除
struct a{
int x,y;
};
a* p=new a{1,2};
delete p;
int *e=new int[114];
delete[] e;