ভেরিয়েবলের মেমোরি অ্যাড্রেস Access করা
Go প্রোগ্রামিং ভাষায়, মেমোরি অ্যাড্রেস হল সেই স্থান যেখানে কোনো ভেরিয়েবল তার মান ধারণ করে। কখনও কখনও আপনি একটি ভেরিয়েবলের মেমোরি অ্যাড্রেস অ্যাক্সেস করতে চান, যেটি পয়েন্টার (pointer) এর মাধ্যমে করা যায়। Go তে পয়েন্টার ব্যবহার করে মেমোরি অ্যাড্রেস এবং মানের সাথে কাজ করা হয়।
চলুন, ভেরিয়েবলের মেমোরি অ্যাড্রেস অ্যাক্সেস করার উপায়গুলি দেখি।
১. পয়েন্টার (Pointer) কি?
পয়েন্টার একটি ভেরিয়েবল যা অন্য কোনো ভেরিয়েবলের মেমোরি অ্যাড্রেস ধারণ করে। পয়েন্টারের মাধ্যমে আপনি সেই ভেরিয়েবলের মান পরিবর্তন করতে পারেন বা তার অবস্থান দেখতে পারেন।
উদাহরণ:
package main
import "fmt"
func main() {
x := 10
p := &x // x এর মেমোরি অ্যাড্রেস পয়েন্টার p তে সংরক্ষণ করা হবে
fmt.Println("x:", x) // আউটপুট: x: 10
fmt.Println("Address of x:", p) // আউটপুট: Address of x: 0xc0000160a0 (মেমোরি অ্যাড্রেস)
}এখানে, &x হল অ্যাড্রেস অপারেটর, যা x ভেরিয়েবলের মেমোরি অ্যাড্রেস প্রদান করে এবং সেই অ্যাড্রেসটি পয়েন্টার p তে সংরক্ষণ করা হয়।
২. পয়েন্টার ডেরেফারেন্স (Dereferencing a Pointer)
যখন আপনি একটি পয়েন্টার দ্বারা কোনো ভেরিয়েবলের মেমোরি অ্যাড্রেস পান, তখন আপনি সেই অ্যাড্রেসে থাকা মানটি অ্যাক্সেস করতে পারবেন। এই প্রক্রিয়াকে ডেরেফারেন্সিং বলা হয়। এটি * (অথবা ডেরেফারেন্স অপারেটর) ব্যবহার করে করা হয়।
উদাহরণ:
package main
import "fmt"
func main() {
x := 10
p := &x // x এর মেমোরি অ্যাড্রেস পয়েন্টারে সংরক্ষণ
fmt.Println("Address of x:", p) // আউটপুট: Address of x: 0xc0000160a0
fmt.Println("Value of x through pointer:", *p) // আউটপুট: Value of x through pointer: 10
}এখানে, *p পয়েন্টার p এর মাধ্যমে অ্যাক্সেস করা মেমোরি অ্যাড্রেসে থাকা মানটি ফেরত দেয়, যা এখানে x এর মান 10।
৩. পয়েন্টার এবং মান পরিবর্তন করা
পয়েন্টার ব্যবহার করে আপনি কোনো ভেরিয়েবলের মান পরিবর্তন করতে পারেন, কারণ পয়েন্টারটি ওই ভেরিয়েবলের মেমোরি অ্যাড্রেসকে পয়েন্ট করছে এবং আপনি সেখানে সরাসরি পরিবর্তন করতে পারবেন।
উদাহরণ:
package main
import "fmt"
func main() {
x := 10
p := &x // x এর মেমোরি অ্যাড্রেস পয়েন্টারে সংরক্ষণ
fmt.Println("Before:", x) // আউটপুট: Before: 10
*p = 20 // পয়েন্টার দিয়ে x এর মান পরিবর্তন
fmt.Println("After:", x) // আউটপুট: After: 20
}এখানে, *p = 20 দ্বারা x এর মান পরিবর্তন করা হয়েছে, কারণ p পয়েন্ট করছে x এর মেমোরি অ্যাড্রেসে এবং আপনি সেখানে সরাসরি মান পরিবর্তন করতে পারছেন।
৪. পয়েন্টার এবং ফাংশন
পয়েন্টার ব্যবহার করে ফাংশনের মাধ্যমে ভেরিয়েবলের মান পরিবর্তন করা যায়। এটি সাধারণত পাস বাই রেফারেন্স (pass by reference) হিসেবে পরিচিত। অর্থাৎ, পয়েন্টার দ্বারা আপনি ফাংশনের ভিতরেও মূল ভেরিয়েবলের মান পরিবর্তন করতে পারেন।
উদাহরণ:
package main
import "fmt"
// ফাংশন যা পয়েন্টার ব্যবহার করে মান পরিবর্তন করে
func updateValue(a *int) {
*a = 30
}
func main() {
x := 10
fmt.Println("Before:", x) // আউটপুট: Before: 10
updateValue(&x) // ফাংশনে পয়েন্টার পাস করা
fmt.Println("After:", x) // আউটপুট: After: 30
}এখানে, updateValue(&x) ফাংশনে x এর পয়েন্টার পাঠানো হয়েছে এবং ফাংশনের ভিতরে পয়েন্টার দিয়ে x এর মান পরিবর্তন করা হয়েছে।
৫. নাল পয়েন্টার (Nil Pointer)
Go তে পয়েন্টার ডিফল্টভাবে nil থাকে যদি তাকে কোন মেমোরি অ্যাড্রেস দেওয়া না হয়। নাল পয়েন্টার মানে হলো পয়েন্টারটি কোনো সঠিক মেমোরি অ্যাড্রেস নির্দেশ করছে না।
উদাহরণ:
package main
import "fmt"
func main() {
var p *int // একটি নাল পয়েন্টার ঘোষণা
fmt.Println(p) // আউটপুট: <nil>
}এখানে, পয়েন্টার p ডিফল্টভাবে nil থাকবে কারণ এটি কোনও মেমোরি অ্যাড্রেস পায়নি।
সারসংক্ষেপ
- পয়েন্টার (Pointer) একটি ভেরিয়েবল যা অন্য একটি ভেরিয়েবলের মেমোরি অ্যাড্রেস ধারণ করে। এটি ভেরিয়েবলের মান পরিবর্তন করতে সহায়তা করে।
- অ্যাড্রেস অপারেটর (
&): একটি ভেরিয়েবলের মেমোরি অ্যাড্রেস পেতে ব্যবহৃত হয়। - ডেরেফারেন্স অপারেটর (
*): পয়েন্টারের মাধ্যমে মেমোরি অ্যাড্রেসের মান অ্যাক্সেস করতে ব্যবহৃত হয়। - পয়েন্টার ব্যবহার করে আপনি ভেরিয়েবলের মান পরিবর্তন করতে পারেন এবং ফাংশনের মাধ্যমে পাস বাই রেফারেন্সও করতে পারেন।
Go তে পয়েন্টার ব্যবহার করা খুবই গুরুত্বপূর্ণ, কারণ এটি মেমোরির সঠিক পরিচালনা এবং কার্যক্রমে দক্ষতা বৃদ্ধি করতে সহায়ক।
Read more