পয়েন্টার

সি প্রোগ্রামিং উদাহরণ (C Examples) - Computer Science

401

পয়েন্টার হলো সি প্রোগ্রামিং ভাষার একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা মেমোরি ম্যানেজমেন্ট এবং ডেটা অ্যাক্সেসিংয়ে সহায়ক ভূমিকা পালন করে। পয়েন্টার একটি ভ্যারিয়েবল, যা অন্য ভ্যারিয়েবলের ঠিকানা (মেমোরি লোকেশন) সংরক্ষণ করে।

পয়েন্টারের ধারণা

পয়েন্টার ভ্যারিয়েবলগুলি * (স্টার) চিহ্ন ব্যবহার করে ঘোষণা করা হয় এবং এটি মেমোরি লোকেশনে থাকা ডেটার উপর সরাসরি অ্যাক্সেসের সুবিধা প্রদান করে। প্রতিটি ভ্যারিয়েবলের একটি নির্দিষ্ট মেমোরি লোকেশন থাকে এবং সেই মেমোরি লোকেশন পয়েন্টারের মাধ্যমে সংরক্ষণ করা সম্ভব।

পয়েন্টার ঘোষণা

পয়েন্টার ভ্যারিয়েবল ঘোষণা করতে ডেটা টাইপের আগে * চিহ্ন ব্যবহার করা হয়।

data_type *pointer_name;

উদাহরণ

int *ptr; // একটি ইন্টিজার পয়েন্টার ptr

পয়েন্টারে মান অ্যাসাইনমেন্ট

পয়েন্টারে মেমোরি অ্যাড্রেস অ্যাসাইন করার জন্য & (এমপার্স্যান্ড) চিহ্ন ব্যবহার করা হয়, যা ভ্যারিয়েবলের ঠিকানা প্রদান করে।

int num = 10;
int *ptr = # // ptr তে num এর মেমোরি ঠিকানা সংরক্ষণ করা হচ্ছে

এখানে ptr পয়েন্টারটি num ভ্যারিয়েবলের মেমোরি ঠিকানা ধরে রাখে। তাই ptr এর মাধ্যমে num এর মানে প্রবেশ করা সম্ভব।

পয়েন্টারের মাধ্যমে ডেটা অ্যাক্সেস

পয়েন্টারের মাধ্যমে ডেটা অ্যাক্সেস বা ম্যানিপুলেট করতে ডিরেফারেন্সিং অপারেটর * ব্যবহার করা হয়।

#include <stdio.h>

int main() {
    int num = 10;
    int *ptr = #

    printf("Value of num: %d\n", num);
    printf("Address of num: %p\n", &num);
    printf("Value stored in ptr: %p\n", ptr);
    printf("Value pointed by ptr: %d\n", *ptr); // ডিরেফারেন্সিং

    return 0;
}

আউটপুট:

Value of num: 10
Address of num: [মেমোরি ঠিকানা]
Value stored in ptr: [মেমোরি ঠিকানা]
Value pointed by ptr: 10

পয়েন্টারের কিছু গুরুত্বপূর্ণ ব্যবহার

১. ফাংশনে পাস-বাই-রেফারেন্স: পয়েন্টার ব্যবহার করে ফাংশনে ডেটা পাস করা হলে মূল ভ্যারিয়েবলের মান পরিবর্তন করা যায়। ২. ডাইনামিক মেমোরি অ্যালোকেশন: পয়েন্টার ব্যবহার করে রানটাইমে মেমোরি বরাদ্দ করা সম্ভব। ৩. ডেটা স্ট্রাকচার বাস্তবায়ন: লিংকড লিস্ট, স্ট্যাক এবং কিউ-এর মতো ডেটা স্ট্রাকচার পয়েন্টার ব্যবহার করে তৈরি করা যায়। ৪. অ্যারে এবং স্ট্রিং পরিচালনা: পয়েন্টারের মাধ্যমে অ্যারে এবং স্ট্রিংয়ের সাথে আরও কার্যকরভাবে কাজ করা যায়।

পয়েন্টার এবং ফাংশন: পাস-বাই-রেফারেন্স উদাহরণ

ধরা যাক, আমরা একটি ফাংশন তৈরি করব যা দুটি সংখ্যার মান অদল-বদল (swap) করবে। পয়েন্টার ব্যবহার করে এটি করা সম্ভব কারণ পাস-বাই-রেফারেন্সের মাধ্যমে মূল মানে পরিবর্তন করা যায়।

#include <stdio.h>

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main() {
    int a = 5, b = 10;
    printf("Before swap: a = %d, b = %d\n", a, b);

    swap(&a, &b); // পাস-বাই-রেফারেন্স, ঠিকানা পাঠানো হচ্ছে

    printf("After swap: a = %d, b = %d\n", a, b);
    return 0;
}

আউটপুট:

Before swap: a = 5, b = 10
After swap: a = 10, b = 5

পয়েন্টার এবং অ্যারে

অ্যারের নাম নিজেই একটি পয়েন্টার হিসেবে কাজ করে, যা প্রথম উপাদানের ঠিকানা নির্দেশ করে।

#include <stdio.h>

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    int *ptr = arr; // arr হল arr[0] এর ঠিকানা

    for (int i = 0; i < 5; i++) {
        printf("Element %d: %d\n", i, *(ptr + i)); // পয়েন্টার অ্যারিথমেটিক্স ব্যবহার
    }

    return 0;
}

আউটপুট:

Element 0: 10
Element 1: 20
Element 2: 30
Element 3: 40
Element 4: 50

পয়েন্টার অ্যারিথমেটিক্স

পয়েন্টারগুলিতে সাধারণ যোগ, বিয়োগ করা সম্ভব, যেমন:

  • ptr++ পরবর্তী মেমোরি লোকেশনে চলে যায়।
  • ptr-- পূর্ববর্তী মেমোরি লোকেশনে চলে যায়।

সংক্ষেপে:

  • পয়েন্টার হলো মেমোরি লোকেশন সংরক্ষণকারী ভ্যারিয়েবল, যা মেমোরিতে ডেটা অ্যাক্সেসে কার্যকর।
  • পয়েন্টার ব্যবহার করে ডেটা ম্যানিপুলেশন, ডাইনামিক মেমোরি অ্যালোকেশন এবং পাস-বাই-রেফারেন্সে সুবিধা পাওয়া যায়।
Content added By

পয়েন্টার হলো সি প্রোগ্রামিং ভাষায় একটি বিশেষ ধরনের ভ্যারিয়েবল, যা অন্য ভ্যারিয়েবলের মেমোরি ঠিকানা ধারণ করে। এটি সরাসরি মেমোরি অ্যাক্সেসের সুবিধা দেয় এবং প্রোগ্রামিংয়ে কিছু বিশেষ সুবিধা ও কার্যকারিতা বৃদ্ধি করে।

পয়েন্টারের ধারণা

পয়েন্টার একটি মেমোরি লোকেশনের ঠিকানা সংরক্ষণ করে। অর্থাৎ এটি কোনো ভ্যারিয়েবলের মান সংরক্ষণ না করে, সেই মানটি কোথায় সংরক্ষিত আছে (মেমোরি ঠিকানা) সেই তথ্য ধারণ করে। * (স্টার) এবং & (এমপার্স্যান্ড) চিহ্নের সাহায্যে পয়েন্টারের মাধ্যমে মেমোরি অ্যাড্রেস এবং ভ্যালু অ্যাক্সেস করা যায়।

int num = 10;
int *ptr = # // ptr পয়েন্টারটি num এর মেমোরি ঠিকানা ধারণ করে

এখানে ptr হলো একটি পয়েন্টার, যা num ভ্যারিয়েবলের ঠিকানা ধারণ করে। * অপারেটর ব্যবহার করে ptr এর মাধ্যমে num এর মানে প্রবেশ করা যায়।

পয়েন্টারের প্রয়োজনীয়তা

১. মেমোরি ম্যানিপুলেশন

পয়েন্টার সরাসরি মেমোরি লোকেশনের সাথে কাজ করে, তাই মেমোরি ম্যানিপুলেশন সহজ হয়। সি ভাষায় মেমোরি ম্যানেজমেন্টের জন্য malloc, calloc, realloc, এবং free এর মতো ফাংশন পয়েন্টার ব্যবহার করে কাজ করে।

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int*) malloc(sizeof(int) * 5); // ৫টি ইন্টিজার জন্য মেমোরি বরাদ্দ
    if (ptr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }
    for (int i = 0; i < 5; i++) {
        ptr[i] = i + 1;
        printf("%d ", ptr[i]);
    }
    free(ptr); // মেমোরি মুক্ত করা
    return 0;
}

২. ফাংশনে পাস-বাই-রেফারেন্স

সি প্রোগ্রামে সাধারণত আর্গুমেন্ট পাসিং পাস-বাই-ভ্যালু পদ্ধতিতে হয়। কিন্তু পয়েন্টার ব্যবহার করে পাস-বাই-রেফারেন্স করা সম্ভব, যার মাধ্যমে মূল ভ্যারিয়েবলের মান পরিবর্তন করা যায়।

#include <stdio.h>

void updateValue(int *num) {
    *num = 20; // পয়েন্টারের মাধ্যমে মূল ভ্যারিয়েবলে মান পরিবর্তন করা
}

int main() {
    int value = 10;
    updateValue(&value); // ফাংশনে ঠিকানা পাঠানো হচ্ছে
    printf("Updated Value: %d\n", value);
    return 0;
}

আউটপুট:

Updated Value: 20

৩. অ্যারে ও স্ট্রিং প্রক্রিয়াকরণে কার্যকর

অ্যারে এবং স্ট্রিং প্রক্রিয়াকরণের ক্ষেত্রে পয়েন্টার ব্যবহারে কোড আরও সহজ এবং কার্যকর হয়। অ্যারের প্রথম উপাদানটির ঠিকানা পুরো অ্যারের জন্য ব্যবহার করা যায়, যা মেমোরি অপটিমাইজেশনেও সহায়ক।

#include <stdio.h>

int main() {
    char name[] = "Alice";
    char *ptr = name; // name অ্যারের প্রথম উপাদানের ঠিকানা

    while (*ptr != '\0') {
        printf("%c ", *ptr); // প্রতিটি ক্যারেক্টার অ্যাক্সেস করা
        ptr++;
    }
    return 0;
}

৪. ডাইনামিক ডেটা স্ট্রাকচার (লিংকড লিস্ট, স্ট্যাক, কিউ)

পয়েন্টার ব্যবহার করে ডাইনামিক ডেটা স্ট্রাকচার তৈরি করা যায়। যেমন, লিংকড লিস্টের প্রতিটি নোডে পরবর্তী নোডের ঠিকানা পয়েন্টার হিসেবে সংরক্ষণ করা হয়, যা নোডগুলিকে সংযুক্ত রাখে।

৫. মাল্টি-ডাইমেনশনাল অ্যারে ও ম্যাট্রিক্স প্রক্রিয়াকরণ

বহুমাত্রিক অ্যারে প্রক্রিয়াকরণে পয়েন্টার কার্যকর ভূমিকা পালন করে, যেখানে প্রতিটি উপাদানের ঠিকানা সহজে অ্যাক্সেস করা যায়। এটি বড় ডেটা প্রক্রিয়াকরণে সহায়ক।

পয়েন্টারের সুবিধা এবং অসুবিধা

সুবিধা:

  • সরাসরি মেমোরি অ্যাক্সেস করা যায়।
  • ফাংশনে পাস-বাই-রেফারেন্সের মাধ্যমে মূল ডেটা পরিবর্তন করা যায়।
  • ডাইনামিক মেমোরি ব্যবস্থাপনায় ব্যবহার করা যায়।
  • ডাইনামিক ডেটা স্ট্রাকচার তৈরিতে কার্যকর।

অসুবিধা:

  • ভুল পয়েন্টার ব্যবহার করলে সেগমেন্টেশন ফল্ট হতে পারে।
  • মেমোরি লিক (মেমোরি হ্রাস) ঘটার সম্ভাবনা থাকে।
  • পয়েন্টারের ভুল ব্যবহারে ডাংলিং পয়েন্টার এবং ওয়াইল্ড পয়েন্টার সমস্যা তৈরি হয়।

সংক্ষেপে

পয়েন্টার হলো প্রোগ্রামের মেমোরি ব্যবস্থাপনা এবং ডেটা অ্যাক্সেসকে আরও কার্যকরী ও সহজ করার একটি গুরুত্বপূর্ণ হাতিয়ার। পয়েন্টার সঠিকভাবে ব্যবহার করলে প্রোগ্রামিং আরও দক্ষ এবং মেমোরি ব্যবহারে কার্যকর হয়।

Content added By

সি প্রোগ্রামিং ভাষায়, একটি ভেরিয়েবলের অ্যাড্রেস ধারণ করা এবং সেই অ্যাড্রেসের মান অ্যাক্সেস করার জন্য দুটি বিশেষ অপারেটর ব্যবহার করা হয়: & (এমপার্স্যান্ড) এবং * (স্টার বা ডিরেফারেন্সিং অপারেটর)

& অপারেটর

& অপারেটর একটি ভেরিয়েবলের মেমোরি অ্যাড্রেস প্রদান করে। এটি কোনো ভেরিয়েবলের সামনে ব্যবহার করলে সেই ভেরিয়েবলের মেমোরি লোকেশন বা ঠিকানা রিটার্ন করে।

উদাহরণ

#include <stdio.h>

int main() {
    int num = 10;
    printf("Address of num: %p\n", &num); // & অপারেটরের মাধ্যমে num এর ঠিকানা পাওয়া
    return 0;
}

আউটপুট:

Address of num: 0x7ffee3b0d0ac (এটি মেমোরি ঠিকানা হতে পারে, ভিন্নও হতে পারে)

এখানে &num ব্যবহার করার মাধ্যমে num ভেরিয়েবলের মেমোরি ঠিকানা প্রিন্ট করা হয়েছে।

* অপারেটর (ডিরেফারেন্সিং অপারেটর)

* অপারেটর একটি পয়েন্টারের মাধ্যমে মেমোরি লোকেশনে থাকা মান অ্যাক্সেস করতে ব্যবহার করা হয়। যখন কোনো পয়েন্টারে * অপারেটর প্রয়োগ করা হয়, তখন সেটি সেই পয়েন্টারের ঠিকানায় থাকা ডেটা রিটার্ন করে। এ কারণে * অপারেটরকে ডিরেফারেন্সিং অপারেটর বলা হয়।

উদাহরণ

#include <stdio.h>

int main() {
    int num = 10;
    int *ptr = # // num এর ঠিকানা ptr এ সংরক্ষণ করা হচ্ছে

    printf("Value of num: %d\n", num);
    printf("Address of num: %p\n", &num);
    printf("Value stored in ptr (address of num): %p\n", ptr);
    printf("Value pointed by ptr: %d\n", *ptr); // * অপারেটরের মাধ্যমে num এর মানে প্রবেশ

    return 0;
}

আউটপুট:

Value of num: 10
Address of num: 0x7ffee3b0d0ac
Value stored in ptr (address of num): 0x7ffee3b0d0ac
Value pointed by ptr: 10

বিবরণ:

  • ptr একটি পয়েন্টার, যা num এর মেমোরি ঠিকানা ধারণ করে।
  • *ptr ব্যবহার করে আমরা ptr দ্বারা নির্দেশিত মেমোরি ঠিকানার মান অ্যাক্সেস করতে পারি, অর্থাৎ num এর মান 10

& এবং * অপারেটরের সম্পর্ক

  • & অপারেটর কোনো ভেরিয়েবলের ঠিকানা ধারণ করে।
  • * অপারেটর সেই ঠিকানায় থাকা আসল মানটি বের করতে সাহায্য করে।

উদাহরণ:

int num = 10;
int *ptr = #
printf("%d\n", *(&num)); // num এর ঠিকানা থেকে আবার num এর মান বের করা

আউটপুট:

Copy code

10

এখানে, *(&num) ব্যবহার করে আমরা num এর মান সরাসরি অ্যাক্সেস করতে পারছি। &num এর মাধ্যমে num এর মেমোরি ঠিকানা পাওয়া যায় এবং * অপারেটরের মাধ্যমে সেই ঠিকানায় থাকা মান অ্যাক্সেস করা যায়।

সংক্ষেপে:

  • & অপারেটর: একটি ভেরিয়েবলের ঠিকানা রিটার্ন করে।
  • * অপারেটর: পয়েন্টার দ্বারা নির্দেশিত ঠিকানার মানে প্রবেশ করতে ব্যবহৃত হয়।

সুতরাং, পয়েন্টারের মাধ্যমে ভেরিয়েবলের মেমোরি ঠিকানার মান অ্যাক্সেস এবং ম্যানিপুলেশন করতে & এবং * অপারেটর ব্যবহার করা হয়।

Content added By

সি প্রোগ্রামিং ভাষায় পয়েন্টার অ্যারে ব্যবহার করে একটি অ্যারে অ্যাক্সেস করা সম্ভব। অ্যারের নাম নিজেই একটি পয়েন্টার হিসেবে কাজ করে, যা অ্যারের প্রথম উপাদানের ঠিকানা নির্দেশ করে। পয়েন্টার ব্যবহার করে অ্যারের প্রতিটি উপাদানে প্রবেশ করার প্রক্রিয়াটিকে পয়েন্টার দিয়ে অ্যারে অ্যাক্সেস বলা হয়। এটি অ্যারের উপাদানগুলিতে সরাসরি মেমোরি অ্যাড্রেস ব্যবহার করে কাজ করতে সাহায্য করে, যা প্রোগ্রামের কার্যকারিতা বৃদ্ধি করে।

পয়েন্টারের মাধ্যমে অ্যারে অ্যাক্সেস করার পদ্ধতি

ধরা যাক, আমাদের একটি int টাইপের অ্যারে আছে এবং আমরা সেটির প্রতিটি উপাদানে পয়েন্টার ব্যবহার করে প্রবেশ করতে চাই।

#include <stdio.h>

int main() {
    int arr[5] = {10, 20, 30, 40, 50}; // একটি অ্যারে ডিক্লেয়ার ও ইনিশিয়ালাইজ করা হয়েছে
    int *ptr = arr; // অ্যারের নাম প্রথম উপাদানের ঠিকানা নির্দেশ করে, তাই ptr = arr

    // পয়েন্টারের মাধ্যমে অ্যারের প্রতিটি উপাদান প্রিন্ট করা
    for (int i = 0; i < 5; i++) {
        printf("Element at index %d: %d\n", i, *(ptr + i));
    }

    return 0;
}

আউটপুট:

mathematica

Copy code

Element at index 0: 10 Element at index 1: 20 Element at index 2: 30 Element at index 3: 40 Element at index 4: 50

ব্যাখ্যা:

  • এখানে ptr নামক একটি পয়েন্টার arr এর প্রথম উপাদানের ঠিকানা ধারণ করেছে।
  • *(ptr + i) ব্যবহার করে i তম ইনডেক্সে থাকা মানে প্রবেশ করা হয়েছে।
    • ptr + i হলো arr[i] এর ঠিকানা।
    • *(ptr + i) হলো সেই ঠিকানায় থাকা মান।

পয়েন্টার অ্যারিথমেটিক্স ব্যবহার করে অ্যারে অ্যাক্সেস

সি ভাষায় পয়েন্টার অ্যারিথমেটিক্স ব্যবহার করে সহজেই অ্যারের প্রতিটি উপাদানে প্রবেশ করা যায়। উদাহরণস্বরূপ, ptr++ ব্যবহার করলে পয়েন্টারটি পরবর্তী ইনডেক্সের ঠিকানায় চলে যায়।

#include <stdio.h>

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    int *ptr = arr; // প্রথম উপাদানের ঠিকানা পয়েন্টারে সেট করা

    // পয়েন্টার ইনক্রিমেন্ট করে প্রতিটি উপাদান প্রিন্ট করা
    for (int i = 0; i < 5; i++) {
        printf("Element %d: %d\n", i, *ptr);
        ptr++; // পরবর্তী ইনডেক্সে যাওয়া
    }

    return 0;
}

আউটপুট:

Element 0: 10
Element 1: 20
Element 2: 30
Element 3: 40
Element 4: 50

ব্যাখ্যা:

  • এখানে ptr প্রতি ইটারেশনে ptr++ দ্বারা পরবর্তী ইনডেক্সে চলে যায় এবং প্রতিটি উপাদানে প্রবেশ করে মান প্রিন্ট করে।

পয়েন্টার অ্যারে ব্যবহারিক প্রয়োগ

এটি ডেটা প্রসেসিং বা অ্যারে অপারেশন করতে কাজে লাগে। যেমন:

১. অ্যারের মানের যোগফল নির্ণয়:

#include <stdio.h>

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    int *ptr = arr;
    int sum = 0;

    for (int i = 0; i < 5; i++) {
        sum += *ptr; // প্রতিটি উপাদানের মান যোগ করা হচ্ছে
        ptr++;
    }

    printf("Sum of array elements: %d\n", sum);
    return 0;
}

আউটপুট:

Sum of array elements: 150

২. পয়েন্টার দিয়ে অ্যারের সর্বাধিক মান নির্ণয়:

#include <stdio.h>

int main() {
    int arr[5] = {10, 20, 75, 40, 50};
    int *ptr = arr;
    int max = *ptr;

    for (int i = 1; i < 5; i++) {
        if (*(ptr + i) > max) {
            max = *(ptr + i);
        }
    }

    printf("Maximum element in array: %d\n", max);
    return 0;
}

আউটপুট:

Maximum element in array: 75

সংক্ষেপে:

  • পয়েন্টার দিয়ে অ্যারে অ্যাক্সেস: অ্যারের প্রথম উপাদানের ঠিকানা ধারণ করে পয়েন্টার দিয়ে প্রতিটি উপাদানে প্রবেশ করা।
  • পয়েন্টার ব্যবহার করে অ্যারে ম্যানিপুলেশনের মাধ্যমে কার্যকর ও সরাসরি মেমোরি অ্যাক্সেস সম্ভব হয়।
Content added By

সি প্রোগ্রামিং ভাষায় ফাংশনে পয়েন্টার পাস করা খুবই গুরুত্বপূর্ণ একটি কৌশল। এটি মূল ভ্যারিয়েবলের মান পরিবর্তন করতে সহায়ক এবং কার্যকরী ডেটা ম্যানিপুলেশনকে সহজ করে। যখন আমরা ফাংশনে পয়েন্টার পাস করি, তখন মূল ভ্যারিয়েবলের মেমোরি ঠিকানা পাস করা হয়, ফলে মূল ডেটাতে সরাসরি পরিবর্তন আনা সম্ভব হয়।

কেন ফাংশনে পয়েন্টার পাস করা প্রয়োজন?

১. পাস-বাই-রেফারেন্স: পয়েন্টার পাস করার মাধ্যমে ফাংশনের মধ্যে মূল ভ্যারিয়েবলের মান পরিবর্তন করা যায়। ২. মেমোরি ব্যবহারের দক্ষতা: বড় ডেটা সরাসরি পাস না করে, তার ঠিকানা পাস করে কাজ করা। ৩. ডাইনামিক মেমোরি ম্যানেজমেন্ট: ডাইনামিক মেমোরি বরাদ্দ এবং মুক্ত করার জন্য ফাংশনে পয়েন্টার পাস করা হয়।

উদাহরণ ১: ফাংশনে পয়েন্টার পাস করে মান পরিবর্তন

এখানে আমরা দুটি সংখ্যার মান অদল-বদল (swap) করব এবং পয়েন্টারের মাধ্যমে ফাংশনে পাস করে তাদের মান পরিবর্তন করব।

#include <stdio.h>

// ফাংশন যা পয়েন্টার পাস করে মান অদল-বদল করে
void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main() {
    int a = 5, b = 10;

    printf("Before swap: a = %d, b = %d\n", a, b);
    swap(&a, &b); // পাস-বাই-রেফারেন্স হিসেবে পয়েন্টার পাস করা
    printf("After swap: a = %d, b = %d\n", a, b);

    return 0;
}

আউটপুট:

Before swap: a = 5, b = 10
After swap: a = 10, b = 5

ব্যাখ্যা:

  • এখানে swap ফাংশনে a এবং b এর ঠিকানা পাস করা হয়েছে।
  • *x এবং *y ব্যবহার করে ফাংশনের মধ্যে a এবং b এর মান অদল-বদল করা হয়েছে।
  • মূল ভ্যারিয়েবলের মান পরিবর্তিত হয়েছে কারণ ফাংশনে তাদের ঠিকানা (পয়েন্টার) পাস করা হয়েছে।

উদাহরণ ২: ফাংশনে পয়েন্টার পাস করে অ্যারে অ্যাক্সেস করা

এখানে আমরা একটি অ্যারে ফাংশনে পয়েন্টার হিসেবে পাস করে তার উপাদানগুলোর গড় নির্ণয় করব।

#include <stdio.h>

// ফাংশন যা পয়েন্টার ব্যবহার করে অ্যারের গড় নির্ণয় করে
float average(int *arr, int size) {
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += *(arr + i); // পয়েন্টার ব্যবহার করে অ্যারের উপাদান অ্যাক্সেস করা
    }
    return (float)sum / size;
}

int main() {
    int numbers[] = {10, 20, 30, 40, 50};
    int size = sizeof(numbers) / sizeof(numbers[0]);

    float avg = average(numbers, size); // অ্যারের নাম পাস করে পয়েন্টার হিসেবে পাঠানো
    printf("Average: %.2f\n", avg);

    return 0;
}

আউটপুট:

Average: 30.00

ব্যাখ্যা:

  • এখানে average ফাংশনে অ্যারের নাম numbers পাস করা হয়েছে, যা অ্যারের প্রথম উপাদানের ঠিকানা নির্দেশ করে।
  • ফাংশনের ভেতরে *(arr + i) এর মাধ্যমে প্রতিটি উপাদানে প্রবেশ করে যোগফল বের করে গড় নির্ণয় করা হয়েছে।

উদাহরণ ৩: ডাইনামিক মেমোরি বরাদ্দ ও ফাংশনে পয়েন্টার পাস করা

পয়েন্টারের মাধ্যমে ফাংশনে ডাইনামিক মেমোরি বরাদ্দ করা যায়। নিচের উদাহরণে, একটি ফাংশন ব্যবহার করে ডাইনামিক মেমোরি বরাদ্দ ও সেটি মুক্ত করা হয়েছে।

#include <stdio.h>
#include <stdlib.h>

// ডাইনামিক মেমোরি বরাদ্দ ফাংশন
void allocateMemory(int **ptr, int size) {
    *ptr = (int*)malloc(size * sizeof(int)); // মেমোরি বরাদ্দ
    if (*ptr == NULL) {
        printf("Memory allocation failed!\n");
        exit(1);
    }
}

// মেমোরি মুক্ত করার ফাংশন
void freeMemory(int *ptr) {
    free(ptr);
    printf("Memory freed.\n");
}

int main() {
    int *arr;
    int size = 5;

    allocateMemory(&arr, size); // মেমোরি বরাদ্দের জন্য পয়েন্টার পাস করা
    for (int i = 0; i < size; i++) {
        arr[i] = i + 1;
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    freeMemory(arr); // মেমোরি মুক্ত করা
    return 0;
}

আউটপুট:

arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
Memory freed.

ব্যাখ্যা:

  • allocateMemory ফাংশনে একটি ডাবল পয়েন্টার (int **ptr) ব্যবহার করা হয়েছে, যাতে ডাইনামিক্যালি বরাদ্দকৃত মেমোরির ঠিকানা মূল পয়েন্টারে সংরক্ষণ করা যায়।
  • freeMemory ফাংশনের মাধ্যমে মেমোরি মুক্ত করা হয়েছে।

সংক্ষেপে

  • ফাংশনে পয়েন্টার পাস করা মূল ভ্যারিয়েবলের মান পরিবর্তন করতে, মেমোরি ম্যানেজ করতে এবং ডেটা স্ট্রাকচার পরিচালনা করতে ব্যবহৃত হয়।
  • পয়েন্টার পাস করার মাধ্যমে পাস-বাই-রেফারেন্স পদ্ধতিতে কাজ করা সম্ভব হয়, যা কার্যকারিতা ও মেমোরি ব্যবহারে দক্ষতা বৃদ্ধি করে।
Content added By
Promotion

Are you sure to start over?

Loading...