指標總結
1.指標的地址和指標上儲存的地址。
指標是儲存地址的變數,而指標自身也有自己的地址。
#include <iostream>
using namespace std;
int main()
{
int *p, a;
p = &a; //將a的地址賦值給p,此時p儲存a的地址
cout << "指標p的地址:" << &p << endl;
cout << "指標p儲存的地址:" << p << endl;
cout << "a的地址:" << &a << endl;
return 0;
}
執行結果:
指標p的地址:0012FF44
指標p儲存的地址:0012FF40
a的地址:0012FF40
2.給指標動態分配/回收記憶體:
通過new可以給指標p動態分配一片記憶體空間,此時p儲存的地址就是該片記憶體空間的首地址。通過delete可以回收該空間。這些是簡單的問題,值得注意的是,通過new給指標p動態分配一片記憶體空間會修改p的值(p的值即p儲存的地址)。
#include <iostream>
using namespace std;
int main()
{
int *p1, a;
p1 = &a; //將a的地址賦值給p,此時p儲存a的地址
cout << "p1儲存的地址:" << p1 << endl;
p1 = new int;
cout << "p1儲存的地址:" << p1 << endl;
return 0;
}
執行結果:
p1儲存的地址:0012FF40
p1儲存的地址:00320708
所以在程式設計時要留意,當為指標p動態分配一片記憶體空間時,p原來所儲存的值會丟失!比如上面例程中如果還利用p去獲得a的值就會出錯!
3.程式:
#include <iostream>
using namespace std;
struct A
{
int x;
A *link;
};
int main()
{
struct A *a = new A, *b = new A; //分別記a,b分配得的記憶體空間為ma,mb
cout << "原地址:" << endl;
cout << "a:" << a << " " << &(a ->x) << " " << a ->link << endl;
cout << "b:" << b << " " << &(b ->x) << " " << b ->link << endl;
a = b; //此時a和b儲存的地址一樣,都是mb的首地址
//而a原來儲存的地址丟失,也就是說a不再指向ma這片記憶體空間,而指向mb
cout << "更新後地址對比:" << endl;
cout << "a:" << a << " " << &(a ->x) << " " << a ->link << endl;
cout << "b:" << b << " " << &(b ->x) << " " << b ->link << endl;
return 0;
}
執行結果:
原地址:
a:003606D0 003606D0 CDCDCDCD
b:00360708 00360708 CDCDCDCD
更新後地址對比:
a:00360708 00360708 CDCDCDCD
b:00360708 00360708 CDCDCDCD
可以看到,b的地址始終沒有變,但a變了。而且觀察還可以發現,其實a、b儲存的地址(亦即ma,mb的首地址)就是各自的x的地址。
4.當使用new為指標p申請一片記憶體空間時,可以同時初始化這片記憶體區域。典型的方式如下:
#include <iostream>
using namespace std;
int main()
{
int *i;
char *c;
bool *b;
i = new int(1);
c = new char('#');
b = new bool(0);
cout << *i << " " << *c << " " << *b << endl;
return 0;
}
執行結果:
1 # 0
這種方式對於int,char等基本資料型別是可以直接使用的,但如果指標型別是結構體型別,就要使用拷貝建構函式。
5.動態分配記憶體時指標本身所佔空間不變
#include <iostream>
using namespace std;
int main()
{
int *p;
cout << sizeof(p) << endl;
p = new int[100]; //開闢一段可以存放一維整型陣列(大小為100)的記憶體空間並返回其首地址
cout << sizeof(p) << endl;
return 0;
}
執行結果:
4
4
p = new int[100]這一步操作只是讓p指向一片大小為100*sizeof(int)的記憶體空間,就是說讓指標p儲存這一段空間的首地址,而p本身所佔用的空間大小是不會變的。
6.對於指標p1和p2,給p1動態分配一段記憶體空間,再令p2 = p1,那麼p2和p1指向同一片記憶體空間,相當於給p2也動態分配一片記憶體空間。
#include <iostream>
using namespace std;
struct Pos
{
int x;
Pos(){x = 3;}
};
int main()
{
Pos *p1, *p2;
p1 = new Pos;
cout << "初狀態:" << endl;
cout << "p1儲存的地址:" << p1 << endl;
cout << "p2儲存的地址:" << p2 << endl;
cout << "p2->x = " << p2->x << endl;
p2 = p1;
cout << endl << "賦值後:" << endl;
cout << "p1儲存的地址:" << p1 << endl;
cout << "p2儲存的地址:" << p2 << endl;
cout << "p2->x = " << p2->x << endl;
return 0;
}
輸出:
初狀態:
p1儲存的地址:0x3e3e58
p2儲存的地址:0x4134e6
p2->x = 1527825539
賦值後:
p1儲存的地址:0x3e3e58
p2儲存的地址:0x3e3e58
p2->x = 3
相關文章
- C/C++指標總結C++指標
- iOS野指標定位總結iOS指標
- c++指標使用經驗總結之懸垂指標C++指標
- 【推薦系統】評估指標總結指標
- C語言指標部分教學總結C語言指標
- C語言指標總結大學霸IT達人C語言指標
- 二級指標做形參機制總結指標
- C++中const與指標、引用的總結C++指標
- 指標和連結串列指標
- 《指標和引用小結》指標
- 誰說Java無指標, JAVA連結串列指標也好煩 - Java 指標迴歸Java指標
- c語言指標彙總C語言指標
- 不平衡資料的分類評價指標總結指標
- C++中的函式指標和函式物件總結C++函式指標物件
- NULL 指標、零指標、野指標Null指標
- [譯]Swift 結構體指標Swift結構體指標
- 運維監控指標彙總運維指標
- C語言第7題:指標總結(兩張表格重點***)C語言指標
- 野指標 空指標指標
- 機器學習中的效能度量指標彙總機器學習指標
- C++物件導向總結——虛指標與虛擬函式表C++物件指標函式
- LC演算法技巧總結(二):雙指標和滑動視窗技巧演算法指標
- 常用標籤總結
- meta標籤總結
- 指標常量和常量指標指標
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- 新晉總監生存指南二——建立指標指標
- 陣列指標,指標陣列陣列指標
- ARC中強指標與弱指標指標
- 控制指標與統計指標指標
- 陣列指標 指標陣列陣列指標
- golang二級指標操作連結串列Golang指標
- C++ 指標常見用法小結C++指標
- golang常用手冊:指標、結構體Golang指標結構體
- 指標體系與樹型結構指標
- 關於指標傳遞和指標的指標指標
- 指標指標
- C語言知識彙總 | 51-C語言字串指標(指向字串的指標)C語言字串指標