指標總結

御史大夫發表於2012-10-02

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



相關文章