ตัวชี้ไปที่ตัวชี้ใน C ++

Taw Chi Pi Thi Taw Chi Ni C



บทความนี้เกี่ยวกับแนวคิดตัวชี้ถึงตัวชี้ใน C ++ ตัวชี้ไปยังตัวชี้หรือจัดเก็บที่อยู่ของตัวชี้อื่นและเปิดใช้งานการจัดการตัวชี้เอง เมื่อใช้แนวคิดนี้ เราสามารถปรับเปลี่ยนตัวชี้จากตำแหน่งอื่นในหน่วยความจำได้อย่างง่ายดาย พอยน์เตอร์คู่มีประโยชน์ในหน่วยความจำที่จัดสรรแบบไดนามิกหรืออาร์เรย์หลายมิติเพื่อจัดการองค์ประกอบของอาร์เรย์ เราจะพูดถึงตัวชี้นี้ถึงการทำงานของตัวชี้และการใช้งานในภาษา C ++ พร้อมตัวอย่างที่เหมาะสม

สถานการณ์ที่ 1: การแสดงหน่วยความจำของตัวชี้ไปยังตัวชี้

ในสถานการณ์สมมตินี้ การประกาศตัวชี้แบบคู่จะคล้ายกับการประกาศตัวชี้โดยมีเครื่องหมายดอกจันเพิ่มเติม (*) ก่อนชื่อตัวชี้ เราสามารถแสดงตำแหน่งหน่วยความจำของตัวชี้คู่ในภาษา C ++ ได้อย่างง่ายดาย ข้อมูลโค้ดของตัวชี้ไปยังตัวชี้ได้รับดังต่อไปนี้:







#รวม
ใช้เนมสเปซมาตรฐาน;
int หลัก ( )
{
หลัก int  = ห้าสิบ ;
ภายใน * พีทีอาร์;
ptrr = & หลัก;
ภายใน ** ptrr1;
ptrr1 = & พีทีอาร์;
ศาล << 'ที่อยู่หน่วยความจำพอยน์เตอร์คือ: \n ' ;
ศาล << 'ptrr (ตัวชี้):' << ptrr << ' \n ' ;
ศาล << '*ptrr1 (ตัวชี้คู่):' <* ptrr1 << ' \n ' ;
ศาล << ' ค่าที่เก็บในตัวชี้คือ: \n ' ;
ศาล << '*ptrr = ' <* ptrr << จบ;
ศาล << '**ptrr1 (ตัวชี้ไปยังตัวชี้) = ' <*** ptrr1 << จบ;
กลับ 0 ;
}


ในฟังก์ชันหลัก เราใช้ตัวแปรซึ่งต้องเก็บที่อยู่หน่วยความจำไว้ในพอยน์เตอร์ ตอนนี้เราเริ่มต้นตัวแปร 'หลัก' หลังจากนั้นเราจะประกาศตัวชี้ 'ptrr' ที่เก็บที่อยู่หน่วยความจำ 'หลัก' ตอนนี้ เราประกาศตัวชี้คู่ที่มีชื่อว่า “**ptrr1” ซึ่งจัดเก็บที่อยู่ของตัวชี้ “*ptrr” ในตอนท้ายของโค้ด เราจะแสดงหน่วยความจำและค่าของพอยน์เตอร์และพอยน์เตอร์คู่บนหน้าจอคอนโซล ผลลัพธ์ของโค้ดนี้มีการกล่าวถึงดังต่อไปนี้:




ที่อยู่หน่วยความจำของตัวชี้ “ptrr” คือ “0x6ffe04” และตัวชี้ “*ptrr1” ยังเก็บที่อยู่หน่วยความจำของตัวชี้ “ptrr” อีกด้วย ค่าที่เก็บไว้ภายในตัวชี้คือ “50” โดยพื้นฐานแล้วที่อยู่ของตัวชี้สองตัวจะเหมือนกับที่อยู่หน่วยความจำของตัวชี้เสมอ



สถานการณ์ที่ 2:  ตัวชี้ไปยังตัวชี้เป็นพารามิเตอร์ฟังก์ชัน

ในสถานการณ์สมมตินี้ เราจะเรียนรู้วิธีส่งผ่านตัวชี้คู่ในฟังก์ชันใดๆ ให้เป็นพารามิเตอร์เพื่อดำเนินการจัดสรรหน่วยความจำชั่วคราวในตัวแปรใดๆ ข้อมูลโค้ดของพารามิเตอร์ฟังก์ชันที่มีตัวชี้คู่มีการกล่าวถึงดังต่อไปนี้:





#รวม
โมฆะ getMemoryAddress ( ภายใน ** double_ptr ) {
คุณอากาศ = 200 ;
* double_ptr = & อุณหภูมิ;
}

int หลัก ( ) {
ภายใน * ptr_1;
ภายใน ** double_ptr;
double_ptr = & ptr_1;
รับที่อยู่หน่วยความจำ ( double_ptr ) ;
มาตรฐาน::cout << 'ค่าของ **double_ptr คือ : ' << ** double_ptr << มาตรฐาน::endl;
กลับ 0 ;
}


ที่นี่เราจะเรียนรู้วิธีการทำงานของแนวคิดตัวชี้ถึงตัวชี้ในภาษา C ++ โปรดจำไว้ว่ามีการประกาศตัวชี้หนึ่งตัวในโปรแกรมเพื่อให้ทำงานกับตัวชี้สองตัวได้ ดังนั้นเราจึงสร้างฟังก์ชัน 'getMemoryAddress' เราออกแบบฟังก์ชันนี้เพื่อให้เมื่อเราส่งพารามิเตอร์ มันจะรับที่อยู่หน่วยความจำของตัวชี้คู่โดยอัตโนมัติ

ในฟังก์ชันนี้ เราใช้ตัวแปร 'tempp' และตัวชี้คู่ '**double_ptr' เราส่งที่อยู่ของตัวแปรที่ระบุซึ่งก็คือ 'tempp' ไปยังตัวชี้คู่และค่าตัวชี้คู่เป็นอาร์กิวเมนต์ของฟังก์ชัน โปรแกรมจะแสดงผลลัพธ์ของโค้ดฟังก์ชันหลักบนหน้าจอคอนโซล ดังนั้นทุกสิ่งที่อยู่ในฟังก์ชันหลักจึงสามารถดำเนินการได้ เราใช้ตัวชี้ 'ptr_1' และตัวชี้คู่เป็น 'double_ptr' ในฟังก์ชันหลัก เราส่งที่อยู่ของตัวชี้ไปยังตัวชี้คู่



ตอนนี้ เราจะส่งผ่านตัวแปรตัวชี้คู่ในฟังก์ชันแทนที่ และส่งตัวชี้ไปยังตัวแปรตัวชี้ในคำสั่งสตรีมเอาท์พุต 'cout' เพื่อแสดงผลลัพธ์ของตัวชี้คู่

เมื่อคอมไพลเลอร์ไปถึงฟังก์ชันแทนที่ ตัวตรวจสอบคอมไพลเลอร์ที่กำหนดฟังก์ชันนี้จะดำเนินการโค้ดภายในฟังก์ชันและส่งผลลัพธ์กลับไปยังฟังก์ชันหลัก

ผลลัพธ์ของรหัสนี้แนบมาดังต่อไปนี้:


ผลลัพธ์: ค่าของตัวชี้คู่คือ 200

สถานการณ์ที่ 3:  การใช้อาร์เรย์ 2 มิติพร้อมตัวชี้หนึ่งไปยังอีกตัวหนึ่ง

ในตัวอย่างนี้ เราจะจัดการกับอาร์เรย์ 2 มิติที่มีตัวชี้คู่ เราใช้อาร์เรย์และส่งที่อยู่ของอาร์เรย์ในตัวชี้ รหัสที่สมบูรณ์ของสถานการณ์นี้มีดังต่อไปนี้:

int หลัก ( ) {
const int แถว = 3 ;
const int cols = 2 ;
ภายใน ** เมทริกซ์ = int ใหม่ * [ แถว ] ;
สำหรับ ( อินท์ ไอ = 0 ; ฉัน < แถว; ++ผม ) {
เมทริกซ์ [ ฉัน ] = อินท์ใหม่ [ คอลัมน์ ] ;
}
สำหรับ ( อินท์ ไอ = 0 ; ฉัน < แถว; ++ผม ) {
สำหรับ ( อินท์เจ = 0 ; เจ < คอล; ++เจ ) {
เมทริกซ์ [ ฉัน ] [ เจ ] = ฉัน * คอลัมน์ + เจ;
}
}
สำหรับ ( อินท์ ไอ = 0 ; ฉัน < แถว; ++ผม ) {
สำหรับ ( อินท์เจ = 0 ; เจ < คอล; ++เจ ) {
ศาล << เมทริกซ์ [ ฉัน ] [ เจ ] << ' ' ;
}
ศาล << จบ;
}
สำหรับ ( อินท์ ไอ = 0 ; ฉัน < แถว; ++ผม ) {
ลบ [ ] เมทริกซ์ [ ฉัน ] ;
}
ลบ [ ] เมทริกซ์;
กลับ 0 ;
}


ดังที่เราทุกคนทราบ เรามีแถวและหลายคอลัมน์ในอาร์เรย์ 2 มิติ ในฟังก์ชันหลัก เราจะเริ่มต้นแถวและคอลัมน์ที่มี 'const int' หลังจากนั้นเราจะจัดสรรพื้นที่หน่วยความจำสำหรับแถวและพื้นที่หน่วยความจำสำหรับคอลัมน์ตามทุกแถว เราส่งค่าจำนวนแถวเป็นตัวชี้ในเมทริกซ์ตัวชี้คู่เป็น '**เมทริกซ์' ในตัวชี้คู่นี้ ดำเนินการวนซ้ำของจำนวนแถวหรือเป็นจริง จากนั้นจะมีการดำเนินการวงในอีกวงหนึ่งจนกว่าเงื่อนไขจะเป็นเท็จ

หลังจากการจัดสรรหน่วยความจำ เราจะกำหนดค่าในอาร์เรย์อีกครั้ง: วงนอกสำหรับแถวและวงในสำหรับคอลัมน์ของอาร์เรย์ 2D ในวงใน ค่าของแถวและคอลัมน์ถูกกำหนดให้กับตัวชี้คู่ และดำเนินการทางคณิตศาสตร์ที่จำเป็น เราแสดงค่าของอาร์เรย์ 2 มิติ เช่น จำนวนแถวและคอลัมน์ที่ได้รับการจัดสรรในหน่วยความจำ จำนวนแถวและคอลัมน์จะชี้ไปที่ตัวชี้คู่ที่เก็บค่าของแถวและคอลัมน์เสมอ ท้ายที่สุด เราจะล้างหน่วยความจำและจัดสรรอาร์เรย์นี้ใหม่จากหน่วยความจำในภาษา C++

เอาต์พุตของอาร์เรย์ 2D ที่มีตัวชี้คู่แนบมาดังต่อไปนี้:

สถานการณ์ที่ 4:  สลับตัวชี้โดยใช้ตัวชี้เป็นตัวชี้

ที่นี่ เราจะเรียนรู้วิธีสลับพอยน์เตอร์ในภาษา C++ โดยการประกาศดับเบิ้ลพอยน์เตอร์ ข้อมูลโค้ดของสถานการณ์นี้แนบมาดังต่อไปนี้:

#รวม
การแลกเปลี่ยนเป็นโมฆะ ( ภายใน ** ptrr_1 คุณ ** ptrr_2 ) {
ภายใน * temp_var = * ptrr_1;
* ptrr_1 = * ptrr_2;
* ptrr_2 = temp_var;
}
int หลัก ( ) {
อินท์x= สิบห้า , ย = 25 ;
ภายใน * ptrrA= & เอ็กซ์, * ptrrB = & และ;
มาตรฐาน::cout << 'ก่อนสลับ: *ptrrA คือ = ' << * ptrrA << ', *ptrrB คือ = ' << * ptrrB << มาตรฐาน::endl;
แลกเปลี่ยน ( & พีทีอาร์เอ, & ptrrB ) ;
มาตรฐาน::cout << 'หลังจากสลับ: *ptrrA  is = ' << * ptrrA << ', *ptrrB  คือ= ' << * ptrrB << มาตรฐาน::endl;
กลับ 0 ;
}


ขั้นแรก เราสร้างฟังก์ชัน swap โดยส่งพอยน์เตอร์ทั้งสองตัวเป็นอาร์กิวเมนต์ของฟังก์ชัน ในฟังก์ชันสลับ เราใช้ตัวชี้ 'temp' และส่งค่าของ 'pointer1' ไปเป็น 'temp' สักระยะหนึ่ง จากนั้นเราส่งต่อค่าของ 'pointer2' ไปยัง 'pointer1' ท้ายที่สุดแล้ว เราจะส่งค่าของตัวชี้ 'temp' ไปยัง 'pointer2'

ในฟังก์ชันหลัก เราจำเป็นต้องมีพอยน์เตอร์สองตัวที่เราส่งผ่านหรือแทนที่ในฟังก์ชัน 'swap' เราส่งที่อยู่ของตัวแปรไปยังพอยน์เตอร์ที่กำหนด จากนั้น ค่าของพอยน์เตอร์ก่อนและหลังการสลับพอยน์เตอร์จะแสดงขึ้น

ผลลัพธ์ของรหัสนี้แนบมาดังต่อไปนี้:


ดังที่เราเห็น ค่าของตัวชี้ถูกสลับได้สำเร็จโดยใช้ตัวชี้คู่ในภาษา C++

บทสรุป

เราสรุปได้ว่าตัวชี้ไปยังตัวชี้จะเก็บที่อยู่หน่วยความจำของตัวชี้ใด ๆ ในภาษา C ++ เสมอ เราสามารถใช้ตัวชี้คู่เพื่อใช้ตำแหน่งหน่วยความจำของตัวชี้ใด ๆ ชั่วคราวได้ตลอดเวลา นี่เป็นวิธีที่มีประสิทธิภาพมากในการจัดการที่อยู่หน่วยความจำทางอ้อมและเข้าถึงข้อมูล