c++ 之重溫指針篇

指針 Who are 有?0.0

基本簡述:

c++是一種與底層接觸較多的語言,而底層無非是內存,每個內存都對應地址。而指針就是一種新的類型,只是他不像int 表示有符號整數,他只是表示的是一串十六進制的地址。在x86下,指針爲了能夠完全尋址。所以被定義爲4個字節,而在x64下,爲8個字節!

基本要素:

1、 需要操作的地址
2、 要操作的內存容量

引出語法:

數據類型 * 指針名;
例如: int * pstr ;

定義之困惑:

int* pstr=0, str=0;
int* pstr1 = 0, *str1 = 0;

對比兩行:相信很多編程新手可能都不太一眼發現問題所在,但我們看一下第一行和第二行的差別,在於第二個變量是否有*號。究竟要說明什麼呢?

代碼如下:

cout << typeid(pstr).name() <<" “<< typeid(str).name() << endl;
cout << typeid(pstr1).name()<<” "<< typeid(str1).name() << endl;

結果:

在這裏插入圖片描述
-------------相信有心人已經發現差別了,雖然是小問題!但卻十分得留意!!!-----------------

混淆概念?不存在:

Ⅰ: 數組指針與指針數組

1、指針數組: 本質是數組,舉個例子:int型指針數組;它就跟int型數組,short型數組一 樣,它是數組,但是每個成員是int*型。

2、數組指針: 本質是指針,他和int型指針,short型指針有什麼區別呢?他指的東西大一點而已,他指向一個數組。

代碼舉例(一看就懂):

	int a{ 1 }, b{ 2 }, c{ 3 };  //定義三個變量
	int* pArr[3]{}; //定義指針數組
	pArr[0] = &a; pArr[1] = &b; pArr[2] = &c;//每個成員都是指針而已
	
	int aa[3] = { 1,2,3 }; //定義一個大小3的數組
	int(*Arrp)[3]{};//定義數組指針  
	Arrp = &aa; //它指向一個大小爲3的數組

Ⅱ 常量指針、指針常量與指向常量的常量指針

1、常量指針: 本質是指針!與變量指針(自己起的)對應,比如:int指針啦、short指針啦。它是什麼呢?常量的指針,常量是什麼?const int ,const short 而已;常量能改變?答案是不能,所以不能通過 *變量 = xxx 來改變常量的大小,它能幹嘛呢?它可以指向別的常量甚至是變量

2、指針常量: 本質是常量!有int型常量,short型常量;它就是指針型的常量而已。比如:int型指針常量x爲int * const x;它有什麼特性呢?它指向一個數可以,但卻不能改變指向了;但它卻可以通過*號改變變量的值

**3、指向常量的常量指針:**滿足以上兩種特性就是這種

代碼範例:

1、常量指針

代碼:

	const int str1 = 10; const int str2 = 20; int str3 = 30;
	//定義常量指針 	
	const int* cpstr1{ &str1 }; //*cpstr1 = 5; 都不能修改值
	cout << "cpstr1 = " << *cpstr1 << endl;
	cpstr1 = &str2;  // *cpstr1 = 5; 都不能修改值
	cout << "cpstr1 = " << *cpstr1 << endl;
	cpstr1 = &str3;  // *cpstr1 = 5; 都不能修改值
	cout << "cpstr3 = " << *cpstr1 << endl;

結果:
在這裏插入圖片描述
總結: 常量指針可指向別的變量或者常量,但是不能通過*號來改變指向地址的值

2、指針常量

代碼:

	int str1{ 10 }, str2{ 20 };
	int* const pcstr = &str1;
	cout << "修改前 str1=" << *pcstr << endl;
	//pcstr = &str2; 這句話不可能成功,因爲指向了就不能改變了
	*pcstr = 30;
	cout << "修改後 str1=" << str1 << endl;

結果:
在這裏插入圖片描述
總結: 指針常量只能指向第一個數,之後不能改變指向;可通過*號來修改指向變量的值

3、指向常量的常量指針

代碼:

	const int str1{ 10 }; const int str2{ 20 };
	const int* const cpcstr = &str1;
	cout << "str1=" << *cpcstr << endl;
	//*cpcstr = 30; //這句話不可能成功
	//cpcstr = &str2;//這句話也不可能成功

結果:
在這裏插入圖片描述
總結: 指向後,不能改變指向,也不能通過*號修改指向地址的值,總之就是隻讀

感謝自己的努力拼搏!!老鐵們,覺得說的還有點道理,記得點個贊哦!!!謝謝哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章