1. 程式人生 > 其它 >c++ 基礎知識(一) 指標

c++ 基礎知識(一) 指標

技術標籤:# c++基礎專欄

目錄

一、指標的基本概念

二、智慧指標

1、auto_ptr:

三、函式指標與指標函式

四、指標的注意事項


一、指標的基本概念

指標是一個特殊的變數,它裡面存放的值為一個記憶體中的一個地址。要搞清楚指標,需要知道四個方面:指標的型別,指標所指向的型別,指標的值和指標所指向的記憶體區。

舉例說明:

1、int *ptr;

2、char *ptr;

以上兩個指標宣告:

指標的型別:

1的指標型別為int*。

2的指標型別為char*。

指標所指向的型別:

1所指向的型別為int。

2所指向的型別為char。

指標的值:

指標的值是指指標本身儲存的數值,這個值被編譯器當做一個地址,而不是一個一般的值。

指標所指向的記憶體區:

從指標的值開始,到sizeof(指標所指向的型別)這塊記憶體區。

空指標:是指向NULL的指標,沒有指任何記憶體地址。

野指標:指向了一塊記憶體地址,但是這塊地址不存在。

二、智慧指標

那什麼是智慧指標呢?

智慧指標本質上是用來儲存指向動態分配物件指標的類,該指標來確保程式不存在記憶體洩漏且是異常安全的。我們下面一點點開始講解:

1、auto_ptr:

雖然這個auto_ptr已經廢棄了,但是我們還是來聊聊它的思想和不足之處。

#include <memory>

int main()
{
    //初始化方式1
    std::auto_ptr<int> sp1(new int(8));
    //初始化方式2
    std::auto_ptr<int> sp2;
    sp2.reset(new int(8));

    return 0;
}

如上圖程式碼,sp1和sp2均持有一個在堆上分配int物件的類,這兩塊記憶體分別可以在sp1,sp2釋放時自動釋放。auto_ptr讓人容易誤用的是其不常用的複製語句。即當複製(拷貝複製或者operator=複製)一個auto_ptr物件時,原物件所持有的堆記憶體物件會轉移到新的物件中,

舉例:

std::auto_ptr<int> sp1(new int(8));
	std::auto_ptr<int> sp2(sp1);
	if (sp1.get() != NULL)
	{
		std::cout << "sp1 is not empty." << std::endl;
	}
	else
	{
		std::cout << "sp1 is empty." << std::endl;
	}

	if (sp2.get() != NULL)
	{
		std::cout << "sp2 is not empty." << std::endl;
	}
	else
	{
		std::cout << "sp2 is empty." << std::endl;
	}
	//測試賦值構造
	std::auto_ptr<int> sp3(new int(8));
	std::auto_ptr<int> sp4;
	sp4 = sp3;
	if (sp3.get() != NULL)
	{
		std::cout << "sp3 is not empty." << std::endl;
	}
	else
	{
		std::cout << "sp3 is empty." << std::endl;
	}

	if (sp4.get() != NULL)
	{
		std::cout << "sp4 is not empty." << std::endl;
	}
	else
	{
		std::cout << "sp4 is empty." << std::endl;
	}

執行程式碼可以得出:

所以這個會發生意想不到的錯誤。基於這個缺陷,後來又引用了其他三種智慧指標:std::unique_ptr,std::shared_ptr,std::weak_ptr。

三、函式指標與指標函式

四、指標的注意事項