পয়েন্টার কেন ব্যবহার করবেন? [বন্ধ]


356

আমি জানি এটি সত্যিই একটি প্রাথমিক প্রশ্ন, তবে আমি উচ্চ-স্তরের ভাষার সাথে কয়েকটি প্রকল্পের কোডিংয়ের পরে কিছু প্রাথমিক সি ++ প্রোগ্রামিং শুরু করেছি।

মূলত আমার তিনটি প্রশ্ন রয়েছে:

  1. সাধারণ চলকগুলির উপরে পয়েন্টার কেন ব্যবহার করবেন?
  2. আমার কখন এবং কোথায় পয়েন্টার ব্যবহার করা উচিত?
  3. আপনি অ্যারে সহ পয়েন্টার কীভাবে ব্যবহার করবেন?

5
এই প্রশ্নে আগে আলোচনা করা হয়েছে আশা করি যে সাহায্য করে!
ডগ টি।

4
বইয়ের তালিকার জন্য, স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / ৮৮৪৪২২/২ দেখুন । জাভার পরে, আমি এক্সিলারেটেড সি ++ খুব দরকারী।
জাব্বা

163
আমরা পয়েন্টার ব্যবহার করি কারণ প্রত্যেককে আপনার বাড়ির একটি অনুলিপি দেওয়ার চেয়ে কাউকে আপনার বাড়িতে ঠিকানা দেওয়া আরও সহজ।
iষি দুয়া

14
@ Iষিদুয়া এটি আমি যে পয়েন্টারের সামনে এসেছি তার একক শ্রেষ্ঠ ব্যাখ্যা। তার জন্য আপনাকে ধন্যবাদ, এটি আমার বোঝাপড়া বাড়িয়ে দিয়েছে :)
জোশ

2
আপনি যখন একাধিক মান / অবজেক্ট ফিরিয়ে দিতে চান তখন পয়েন্টারগুলিও ব্যবহার করা যেতে পারে।
গৌরব

উত্তর:


172
  • সাধারণ চলকগুলির উপরে পয়েন্টার কেন ব্যবহার করবেন?

সংক্ষিপ্ত উত্তর: না। ;-) যেখানে আপনি অন্য কিছু ব্যবহার করতে পারবেন না সেখানে পয়েন্টার ব্যবহার করতে হবে। এটি হয় উপযুক্ত কার্যকারিতার অভাব, ডাটা প্রকারের অনুপস্থিত বা খাঁটি পারফোমেন্সের কারণে। আরও নীচে ...

  • আমার কখন এবং কোথায় পয়েন্টার ব্যবহার করা উচিত?

এখানে সংক্ষিপ্ত উত্তর হ'ল: যেখানে আপনি অন্য কিছু ব্যবহার করতে পারবেন না। সি তে আপনার কাছে স্ট্রিংয়ের মতো জটিল ডেটাটাইপগুলির জন্য কোনও সমর্থন নেই। কোনও ফাংশনে "রেফারেন্স দ্বারা" ভেরিয়েবল পাস করার কোনও উপায় নেই। আপনি পয়েন্টার ব্যবহার করতে হবে যেখানে। এছাড়াও আপনি তাদেরকে ভার্চুয়াল কোনও কিছু, লিঙ্কযুক্ত তালিকাগুলি, স্ট্রাইকগুলির সদস্য এবং এগুলি নির্দেশ করতে পারেন। তবে আসুন এখানে intoোকা না।

  • আপনি অ্যারে সহ পয়েন্টার কীভাবে ব্যবহার করবেন?

সামান্য প্রচেষ্টা এবং অনেক বিভ্রান্তির সাথে। ;-) যদি আমরা ইনট এবং চরের মতো সাধারণ ডেটা ধরণের কথা বলি তবে একটি অ্যারে এবং পয়েন্টারের মধ্যে সামান্য পার্থক্য থাকে। এই ঘোষণাগুলি খুব অনুরূপ (তবে একই নয় - যেমন, sizeofবিভিন্ন মান ফেরত দেবে):

char* a = "Hello";
char a[] = "Hello";

আপনি অ্যারেতে যে কোনও উপাদান পৌঁছাতে পারেন

printf("Second char is: %c", a[1]);

সূচী 1 যেহেতু অ্যারের উপাদান 0 :-) দিয়ে শুরু হয়

অথবা আপনি সমানভাবে এটি করতে পারে

printf("Second char is: %c", *(a+1));

পয়েন্টার অপারেটর (* *) প্রয়োজন যেহেতু আমরা প্রিন্টফকে বলছি যে আমরা একটি অক্ষর মুদ্রণ করতে চাই। * * ছাড়া মেমরি ঠিকানার চরিত্র উপস্থাপনাটি মুদ্রিত হবে। এখন আমরা পরিবর্তে চরিত্রটি ব্যবহার করছি। আমরা যদি% c এর পরিবর্তে% s ব্যবহার করে থাকি, আমরা প্রিন্টফকে 'এ' প্লাস ওয়ান দ্বারা চিহ্নিত মেমরি ঠিকানার বিষয়বস্তু মুদ্রণ করতে বলতাম (উপরে এই উদাহরণে), এবং আমাদের * লাগাতে হবে না সামনে:

printf("Second char is: %s", (a+1)); /* WRONG */

তবে এটি কেবলমাত্র দ্বিতীয় অক্ষরটি মুদ্রণ করতে পারে না, বরং নাল অক্ষর (\ 0) না পাওয়া পর্যন্ত পরবর্তী মেমরি ঠিকানার সমস্ত অক্ষর পরিবর্তে। এবং এখানেই জিনিসগুলি বিপজ্জনক হতে শুরু করে। আপনি যদি ঘটনাক্রমে% s বিন্যাসক সহ চর পয়েন্টারের পরিবর্তে টাইপ পূর্ণসংখ্যার একটি ভেরিয়েবল মুদ্রণ এবং প্রিন্ট করেন?

char* a = "Hello";
int b = 120;
printf("Second char is: %s", b);

এটি মেমরি ঠিকানার 120 তে যা পাওয়া যায় তা মুদ্রণ করবে এবং শূন্য চরিত্র না পাওয়া পর্যন্ত মুদ্রণ চালিয়ে যাবে। এই মুদ্রণ বিবৃতিটি সম্পাদন করা ভুল এবং অবৈধ, তবে এটি সম্ভবত যেভাবেই কাজ করবে, যেহেতু একটি পয়েন্টার আসলে অনেক পরিবেশে টাইপ ইন্টের হয়। এর পরিবর্তে আপনি যদি স্প্রিন্টফ () ব্যবহার করতে এবং এইভাবে খুব দীর্ঘ "চর অ্যারে" অন্য ভেরিয়েবলের জন্য নির্ধারণ করতে চান তবে আপনি যে সমস্যার সৃষ্টি করতে পারেন তা কল্পনা করুন, যা কেবলমাত্র একটি নির্দিষ্ট সীমিত স্থান বরাদ্দ পেয়েছিল। আপনি সম্ভবত স্মৃতিতে অন্য কিছু লিখে লিখে আপনার প্রোগ্রামটি ক্রাশের কারণ হয়ে উঠবেন (যদি আপনি ভাগ্যবান)।

ওহ, এবং আপনি যখন ঘোষনা করার সময় আপনি চর অ্যারে / পয়েন্টারকে স্ট্রিং মান বরাদ্দ করেন না, আপনাকে মান দেওয়ার আগে আপনাকে এটিকে পর্যাপ্ত পরিমাণ মেমোরি বরাদ্দ করতে হবে। Malloc, কলোক বা অনুরূপ ব্যবহার করে। এটি যেহেতু আপনি কেবল আপনার অ্যারে / একক একক মেমরি ঠিকানার একটি উপাদানকে নির্দেশ করতে বলেছিলেন। সুতরাং এখানে কয়েকটি উদাহরণ:

char* x;
/* Allocate 6 bytes of memory for me and point x to the first of them. */
x = (char*) malloc(6);
x[0] = 'H';
x[1] = 'e';
x[2] = 'l';
x[3] = 'l';
x[4] = 'o';
x[5] = '\0';
printf("String \"%s\" at address: %d\n", x, x);
/* Delete the allocation (reservation) of the memory. */
/* The char pointer x is still pointing to this address in memory though! */
free(x);
/* Same as malloc but here the allocated space is filled with null characters!*/
x = (char *) calloc(6, sizeof(x));
x[0] = 'H';
x[1] = 'e';
x[2] = 'l';
x[3] = 'l';
x[4] = 'o';
x[5] = '\0';
printf("String \"%s\" at address: %d\n", x, x);
/* And delete the allocation again... */
free(x);
/* We can set the size at declaration time as well */
char xx[6];
xx[0] = 'H';
xx[1] = 'e';
xx[2] = 'l';
xx[3] = 'l';
xx[4] = 'o';
xx[5] = '\0';
printf("String \"%s\" at address: %d\n", xx, xx);

মনে রাখবেন যে আপনি বরাদ্দ মেমরির একটি ফ্রি () সঞ্চালনের পরেও আপনি ভেরিয়েবল এক্সটি ব্যবহার করতে পারেন তবে সেখানে কী রয়েছে তা আপনি জানেন না। এছাড়াও লক্ষ্য করুন যে দুটি প্রিন্টফ () আপনাকে আলাদা আলাদা ঠিকানা দিতে পারে, যেহেতু মেমরির দ্বিতীয় বরাদ্দ প্রথম স্থান হিসাবে একই জায়গায় সঞ্চালিত হয় তার কোনও গ্যারান্টি নেই।


8
এতে আপনার 120 টি উদাহরণ ভুল। এটি% সি ব্যবহার করছে না% s তাই কোনও বাগ নেই; এটি কেবল ছোট হাতের অক্ষর x প্রিন্ট করে। তদুপরি, আপনার পরবর্তী দাবী যে পয়েন্টারটি টাইপ ইন্ট হয় সে ভুল এবং খুব খারাপ পরামর্শ কোনও সি প্রোগ্রামারকে পয়েন্টারগুলির সাথে অনভিজ্ঞ।
আর .. গীটহাব বন্ধ করুন ICE

13
-1 আপনি ভাল শুরু করেছেন তবে প্রথম উদাহরণটি ভুল। না, এটি একরকম নয়। প্রথম ক্ষেত্রে aএকটি পয়েন্টার এবং দ্বিতীয় ক্ষেত্রে aএকটি অ্যারে হয়। আমি ইতিমধ্যে এটি উল্লেখ করেছি? এটি একই না! নিজের জন্য যাচাই করুন: মাপের (ক) তুলনা করুন, একটি অ্যারেতে একটি নতুন ঠিকানা বরাদ্দ করার চেষ্টা করুন। এটি কাজ করবে না।
বিক্রয়বিটজে

42
char* a = "Hello";এবং char a[] = "Hello";এক নয়, তারা একেবারেই আলাদা। একটি পয়েন্টারটিকে অন্যটিকে অ্যারে ঘোষণা করে। একটি চেষ্টা করুন sizeofএবং আপনি পার্থক্য দেখতে পান।
প্যাট্রিক Schlüter

12
"এই মুদ্রণ বিবৃতিটি সম্পাদন করা ভুল বা অবৈধ নয়"। এটি সাধারণ ভুল। এই মুদ্রণ বিবৃতিতে আচরণের অপরিবর্তিত রয়েছে। অনেক বাস্তবায়নে এটি অ্যাক্সেস লঙ্ঘনের কারণ ঘটবে। পয়েন্টারগুলি আসলে টাইপ ইন্টের নয়, এগুলি আসলে পয়েন্টার (এবং অন্য কিছু নয়)।
মনকারসে

19
-১, আপনি এখানে অনেকগুলি তথ্য ভুল পেয়েছেন এবং আমি ঠিকই বলে দেব যে আপনি উক্ত সংস্থাগুলির পরিমাণ বা গৃহীত উত্তর স্থিতির প্রাপ্য নন।
asveikau

50

পয়েন্টার ব্যবহার করার একটি কারণ হ'ল একটি ভেরিয়েবল বা কোনও অবজেক্টকে একটি ডাকা ফাংশনে পরিবর্তন করা যেতে পারে।

সি ++ তে পয়েন্টারগুলির চেয়ে রেফারেন্স ব্যবহার করা আরও ভাল অনুশীলন। যদিও উল্লেখগুলি মূলত পয়েন্টার হলেও সি ++ কিছু পরিমাণে সত্যটি লুকিয়ে রাখে এবং মনে হয় যেন আপনি কোনও মান দিয়ে চলে যাচ্ছেন। এটি কলিং ফাংশনটি পাস করার শব্দার্থবিজ্ঞান পরিবর্তন না করেই যেভাবে মূল্য গ্রহণ করে তা পরিবর্তন করা সহজ করে তোলে।

নিম্নলিখিত উদাহরণগুলি বিবেচনা করুন:

তথ্যসূত্র ব্যবহার:

public void doSomething()
{
    int i = 10;
    doSomethingElse(i);  // passes i by references since doSomethingElse() receives it
                         // by reference, but the syntax makes it appear as if i is passed
                         // by value
}

public void doSomethingElse(int& i)  // receives i as a reference
{
    cout << i << endl;
}

পয়েন্টার ব্যবহার:

public void doSomething()
{
    int i = 10;
    doSomethingElse(&i);
}

public void doSomethingElse(int* i)
{
    cout << *i << endl;
}

16
রেফারেন্সগুলি নিরাপদ বলে উল্লেখ করা সম্ভবত একটি ভাল ধারণা, আপনি কোনও নাল রেফারেন্স পাস করতে পারবেন না।
চামচমাইজার

26
হ্যাঁ, এটি সম্ভবত উল্লেখগুলি ব্যবহারের সবচেয়ে বড় সুবিধা। এটা ইশারা জন্য ধন্যবাদ। কোনও
পাং

2
আপনি অবশ্যই নাল রেফারেন্স পাস করতে পারেন । এটি নাল পয়েন্টারটি পাস করার মতো সহজ নয়।
n0rd

1
@ n0rd এর সাথে সম্মতি দিন। যদি আপনি ভাবেন যে আপনি নাল রেফারেন্সটি পাস করতে পারবেন না তবে আপনি ভুল। নাল রেফারেন্সের চেয়ে ঝুঁকির রেফারেন্সটি পাস করা সহজ, তবে শেষ পর্যন্ত আপনি যথেষ্ট পরিমাণে করতে পারেন। উল্লেখগুলি কোনও ইঞ্জিনিয়ারকে পায়ে গুলি করা থেকে রক্ষা করার কোনও রূপালী বুলেট নয়। এটি সরাসরি দেখুন
WhozCraig

2
@ n0rd: এটি করা সুস্পষ্টভাবে সংজ্ঞায়িত আচরণ।
ড্যানিয়েল কামিল কোজার

42
  1. পয়েন্টারগুলি আপনাকে একাধিক অবস্থান থেকে মেমরিতে একই স্থানটি উল্লেখ করতে দেয়। এর অর্থ হল আপনি এক জায়গায় মেমরি আপডেট করতে পারবেন এবং আপনার প্রোগ্রামের অন্য স্থান থেকে পরিবর্তনটি দেখা যাবে। আপনি আপনার ডেটা স্ট্রাকচারে উপাদানগুলি ভাগ করতে সক্ষম হয়ে স্থান বাঁচাতে পারবেন।
  2. আপনি ঠিকানা পেতে এবং মেমরির একটি নির্দিষ্ট স্পটে চারপাশে পাস করার প্রয়োজন যেখানেই আপনাকে পয়েন্টার ব্যবহার করা উচিত। আপনি অ্যারে নেভিগেট করতে পয়েন্টারগুলিও ব্যবহার করতে পারেন:
  3. একটি অ্যারেটি একটি স্বতন্ত্র মেমরির একটি ব্লক যা নির্দিষ্ট ধরণের সাথে বরাদ্দ করা হয়েছে। অ্যারের নামটিতে অ্যারের প্রারম্ভিক স্পটটির মান থাকে। আপনি 1 যোগ করার সময়, এটি আপনাকে দ্বিতীয় স্থানে নিয়ে যায়। এটি আপনাকে লুপগুলি লেখার অনুমতি দেয় যা অ্যারে অ্যাক্সেস করার ক্ষেত্রে স্পষ্টভাবে কাউন্টার ছাড়াই অ্যারে স্লাইড করে এমন পয়েন্টার বৃদ্ধি করে।

এখানে সি তে একটি উদাহরণ দেওয়া হল:

char hello[] = "hello";

char *p = hello;

while (*p)
{
    *p += 1; // increase the character by one

    p += 1; // move to the next spot
}

printf(hello);

কপি করে প্রিন্ট

ifmmp

কারণ এটি প্রতিটি চরিত্রের জন্য মূল্য নেয় এবং একে একে বৃদ্ধি করে।


because it takes the value for each character and increments it by one। আসকি প্রতিনিধিত্ব হয় বা কিভাবে?
এডুয়ার্ডো এস

28

পয়েন্টারগুলি অন্য ভেরিয়েবলের অপ্রত্যক্ষ রেফারেন্স পাওয়ার এক উপায়। অধিষ্ঠিত পরিবর্তে মান একটি পরিবর্তনশীল এর, তারা আপনাকে তার বলতে ঠিকানা । অ্যারের সাথে কাজ করার ক্ষেত্রে এটি বিশেষভাবে কার্যকর, যেহেতু অ্যারেতে প্রথম উপাদানটির পয়েন্টার ব্যবহার করে (এর ঠিকানা) আপনি পয়েন্টারটি বাড়িয়ে (পরবর্তী ঠিকানার অবস্থানের দিকে) দ্রুত পরবর্তী উপাদানটি খুঁজে পেতে পারেন।

পয়েন্টার এবং পয়েন্টার পাটিগণিতের সর্বোত্তম ব্যাখ্যা যা আমি পড়েছি তা কে ও আর এর সি প্রোগ্রামিং ল্যাঙ্গুয়েজে রয়েছে । সি ++ শিখতে শুরু করার জন্য একটি ভাল বই হ'ল সি ++ প্রাইমার


1
ধন্যবাদ! অবশেষে, স্ট্যাক ব্যবহারের সুবিধাগুলির ব্যবহারিক ব্যাখ্যা! একটি অ্যারেতে অবস্থিত একটি পয়েন্টার এছাড়াও @ এবং মান এর সাথে সম্পর্কিত মানগুলি অ্যাক্সেস কর্মক্ষমতা উন্নত করে?

এটি সম্ভবত আমি সবচেয়ে ভাল ব্যাখ্যা পড়েছি। লোকদের "অতি-জটিল" জিনিসগুলির একটি উপায় রয়েছে :)
ডেটিলিয়াম

23

আমাকেও চেষ্টা করে উত্তর দিন।

পয়েন্টারগুলি রেফারেন্সের মতো। অন্য কথায়, এগুলি অনুলিপিগুলি নয়, বরং আসল মান উল্লেখ করার উপায়।

অন্য কোনও কিছুর আগে, আপনি যখন এমবেডেড হার্ডওয়ারের সাথে কাজ করছেন তখন আপনাকে সাধারণত পয়েন্টার ব্যবহার করতে হবে এমন এক জায়গা । হতে পারে আপনাকে ডিজিটাল আইও পিনের স্থিতি টগল করতে হবে। হতে পারে আপনি একটি বাধা প্রক্রিয়াজাত করছেন এবং একটি নির্দিষ্ট স্থানে একটি মান সঞ্চয় করতে হবে। আপনি ছবি পেতে। তবে, আপনি যদি সরাসরি হার্ডওয়্যার নিয়ে কাজ না করে থাকেন এবং কোন ধরণের ব্যবহার করবেন তা নিয়ে কেবল ভাবছেন, পড়ুন।

পয়েন্টারগুলি কেন সাধারণ ভেরিয়েবলের বিপরীতে ব্যবহার করবেন? ক্লাস, স্ট্রাকচার এবং অ্যারেগুলির মতো জটিল ধরণের সাথে যখন আপনি কাজ করছেন তখন উত্তরটি পরিষ্কার হয়ে যায়। আপনি যদি কোনও সাধারণ পরিবর্তনশীল ব্যবহার করতে চান তবে আপনি একটি অনুলিপি তৈরি করতে পারেন (সংকলকরা কিছু পরিস্থিতিতে এটি রোধ করতে যথেষ্ট স্মার্ট এবং সি ++ 11ও সহায়তা করে তবে আমরা আপাতত সেই আলোচনা থেকে দূরে থাকব)।

এখন যদি আপনি মূল মানটি পরিবর্তন করতে চান তবে কি হবে? আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

MyType a; //let's ignore what MyType actually is right now.
a = modify(a); 

এটি ঠিক কাজ করবে এবং আপনি পয়েন্টার কেন ব্যবহার করছেন তা ঠিক যদি না জানেন তবে আপনার সেগুলি ব্যবহার করা উচিত নয়। "তারা সম্ভবত দ্রুত" কারণ থেকে সাবধান থাকুন। আপনার নিজের পরীক্ষা চালান এবং সেগুলি যদি দ্রুততর হয় তবে তাদের ব্যবহার করুন।

তবে, যাক আপনাকে এমন একটি সমস্যা সমাধান করছেন যেখানে আপনাকে মেমরি বরাদ্দ করতে হবে। আপনি যখন মেমরি বরাদ্দ করেন তখন আপনার এটিকে হ্রাস করতে হবে। মেমরি বরাদ্দ সফল হতে পারে বা নাও হতে পারে। এখানেই পয়েন্টারগুলি কার্যকরভাবে আসে - এটি আপনাকে বরাদ্দ করা অবজেক্টটির অস্তিত্বের জন্য আপনাকে পরীক্ষা করার অনুমতি দেয় এবং আপনাকে পয়েন্টারটিকে ডি-রেফারেন্স করে মেমরির জন্য বরাদ্দকৃত বস্তুটি অ্যাক্সেস করার অনুমতি দেয়।

MyType *p = NULL; //empty pointer
if(p)
{
    //we never reach here, because the pointer points to nothing
}
//now, let's allocate some memory
p = new MyType[50000];
if(p) //if the memory was allocated, this test will pass
{
    //we can do something with our allocated array
    for(size_t i=0; i!=50000; i++)
    {
        MyType &v = *(p+i); //get a reference to the ith object
        //do something with it
        //...
    }
    delete[] p; //we're done. de-allocate the memory
}

আপনি পয়েন্টার কেন ব্যবহার করবেন তার মূল চাবিকাঠি - রেফারেন্সগুলি ধরে নিচ্ছে যে উপাদানটি আপনি উল্লেখ করছেন তা ইতিমধ্যে বিদ্যমান রয়েছে । একটি পয়েন্টার না।

আপনি পয়েন্টার ব্যবহার করার অন্য কারণটি (বা কমপক্ষে তাদের সাথে ডিল করতে হবে) কারণ এটি একটি ডেটা টাইপ যা রেফারেন্সের আগে বিদ্যমান ছিল। সুতরাং, যদি আপনি লাইব্রেরিগুলি ব্যবহার করে এমন জিনিসগুলি শেষ করেন যা আপনি জানেন যে তারা আরও ভাল, তবে আপনি দেখতে পাবেন যে এই লাইব্রেরিগুলির অনেকগুলি পুরো জায়গা জুড়ে পয়েন্টার ব্যবহার করে, কেবলমাত্র তারা দীর্ঘকাল ধরে থাকার কারণে (প্রচুর পরিমাণে সেগুলির মধ্যে সি ++ এর আগে লেখা হয়েছিল)।

আপনি যদি কোনও লাইব্রেরি ব্যবহার না করেন, আপনি নিজের কোডটি এমনভাবে ডিজাইন করতে পারেন যাতে আপনি পয়েন্টার থেকে দূরে থাকতে পারেন, তবে যে পয়েন্টারগুলি ভাষার অন্যতম একটি প্রাথমিক ধরণ, সেগুলি ব্যবহার করার জন্য আপনি যত দ্রুত স্বাচ্ছন্দ্য বোধ করবেন তত বেশি আপনার সি ++ দক্ষতা হবে।

রক্ষণাবেক্ষণের দৃষ্টিকোণ থেকে, আমার আরও উল্লেখ করা উচিত যে আপনি যখন পয়েন্টার ব্যবহার করেন তখন আপনাকে হয় হয় বৈধতার জন্য তাদের বৈধতার জন্য পরীক্ষা করতে হবে এবং কেসটি পরিচালনা করতে হবে, বা কেবল তারা বৈধ বলে ধরে নিবেন এবং সত্যটি স্বীকার করবেন যে আপনার প্রোগ্রামটি ক্রাশ বা খারাপ হতে পারে যখন অনুমানটি ভেঙে যায়। অন্য একটি উপায় রাখুন, পয়েন্টারগুলির সাথে আপনার পছন্দটি হ'ল কোড জটিলতা বা আরও রক্ষণাবেক্ষণের প্রচেষ্টাকে পরিচয় করিয়ে দেওয়া হয় যখন কোনও কিছু ভেঙে যায় এবং আপনি স্মৃতি দুর্নীতির মতো পয়েন্টারগুলির দ্বারা চিহ্নিত একটি ত্রুটি গোটা শ্রেণীর অন্তর্ভুক্ত এমন একটি বাগ অনুসন্ধান করতে চেষ্টা করছেন।

সুতরাং আপনি যদি আপনার সমস্ত কোড নিয়ন্ত্রণ করেন তবে পয়েন্টার থেকে দূরে থাকুন এবং পরিবর্তে রেফারেন্সগুলি ব্যবহার করুন, যখন আপনি পারেন তখন এগুলি স্থির রেখে। এটি আপনাকে আপনার সামগ্রীর জীবনকাল সম্পর্কে চিন্তা করতে বাধ্য করবে এবং আপনার কোডটি বোঝার সহজ রাখবে।

এই পার্থক্যটি কেবল মনে রাখবেন: একটি রেফারেন্স মূলত একটি বৈধ পয়েন্টার। একটি পয়েন্টার সর্বদা বৈধ হয় না।

সুতরাং আমি কি বলছি যে এটি একটি অবৈধ রেফারেন্স তৈরি করা অসম্ভব? না এটি সম্পূর্ণ সম্ভব, কারণ সি ++ আপনাকে প্রায় কিছু করতে দেয়। অনিচ্ছাকৃতভাবে করা কেবল আরও শক্ত এবং আপনি কতটা বাগ অনিচ্ছাকৃত তা অবাক করে যাবেন :)


আপনি মেমরি-ম্যাপযুক্ত আইওর জন্য দুর্দান্ত মোড়কের ক্লাস লিখতে পারেন যা দিয়ে আপনি প্রয়োজনীয়ভাবে পয়েন্টার ব্যবহার এড়াতে পারবেন।
einpoklum

13

এখানে কিছুটা আলাদা, তবে অন্তর্দৃষ্টিপূর্ণ কেন সি এর অনেকগুলি বৈশিষ্ট্য বোধগম্য তা গ্রহণ করুন: http://steve.yegge.googlepages.com/tour-de-babel#C

মূলত, স্ট্যান্ডার্ড সিপিইউ আর্কিটেকচার হ'ল ভন নিউম্যান আর্কিটেকচার এবং এটি মেশিনে কোনও ডেটা আইটেমের অবস্থান উল্লেখ করতে এবং এর সাথে একটি গাণিতিক করতে এটি প্রচুর কার্যকর। আপনি যদি অ্যাসেম্বলি ভাষার কোনও রূপ জানেন তবে আপনি দ্রুত দেখতে পাবেন এটি নিম্ন স্তরে কতটা গুরুত্বপূর্ণ।

সি ++ পয়েন্টারগুলিকে কিছুটা বিভ্রান্ত করে তোলে, যেহেতু এটি কখনও কখনও এটি আপনার জন্য পরিচালনা করে এবং "প্রভাবগুলি" আকারে তাদের প্রভাবটি আড়াল করে। যদি আপনি স্ট্রেট সি ব্যবহার করেন তবে পয়েন্টারগুলির প্রয়োজনীয়তা আরও স্পষ্ট: কল-বাই-রেফারেন্স করার অন্য কোনও উপায় নেই, এটি স্ট্রিং সংরক্ষণের সেরা উপায়, এটি অ্যারের মাধ্যমে পুনরাবৃত্তি করার সর্বোত্তম উপায় ইত্যাদি


12

পয়েন্টারগুলির একটি ব্যবহার (আমি ইতিমধ্যে অন্যান্য ব্যক্তির পোস্টগুলিতে আচ্ছাদিত জিনিসগুলি উল্লেখ করব না) হ'ল মেমরি অ্যাক্সেস যা আপনি বরাদ্দ করেননি। এটি পিসি প্রোগ্রামিংয়ের জন্য খুব বেশি কার্যকর নয় তবে এটি এম্বেড প্রোগ্রামিংয়ে মেমরি ম্যাপযুক্ত হার্ডওয়্যার ডিভাইসগুলি অ্যাক্সেস করতে ব্যবহৃত হয়।

ডস-এর পুরানো দিনগুলিতে, আপনি সরাসরি পয়েন্টার ঘোষণা করে ভিডিও কার্ডের ভিডিও মেমরিটিতে অ্যাক্সেস করতে সক্ষম হতেন:

unsigned char *pVideoMemory = (unsigned char *)0xA0000000;

অনেক এম্বেড থাকা ডিভাইস এখনও এই কৌশলটি ব্যবহার করে।


পয়েন্টার ব্যবহার করার কারণ নয় - একটি স্প্যান-জাতীয় কাঠামো - যা দৈর্ঘ্যও ধারণ করে - এটি আরও বেশি উপযুক্ত। এই দিনগুলি এটি gsl::span, এবং শীঘ্রই এটি হবে std::span
einpoklum

10

বড় অংশে, পয়েন্টারগুলি অ্যারে হয় (সি / সি ++ তে) - এগুলি মেমরির ঠিকানা এবং এগুলি চাইলে অ্যারের মতো অ্যাক্সেস করা যায় ("সাধারণ" ক্ষেত্রে)।

যেহেতু তারা কোনও আইটেমের ঠিকানা, সেগুলি ছোট: তারা কেবল কোনও ঠিকানার জায়গা নেয়। যেহেতু তারা ছোট, তাই কোনও ফাংশনে তাদের পাঠানো সস্তা is এবং তারপরে তারা সেই ফাংশনটিকে অনুলিপি না করে আসল আইটেমটিতে কাজ করার অনুমতি দেয়।

আপনি যদি গতিশীল স্টোরেজ বরাদ্দ করতে চান (যেমন একটি লিঙ্কযুক্ত তালিকার জন্য), আপনাকে অবশ্যই পয়েন্টার ব্যবহার করতে হবে, কারণ এগুলি গাদা থেকে মেমরি দখল করার একমাত্র উপায়।


8
আমি মনে করি এটি পয়েন্টার অ্যারে বলে বিভ্রান্তিকর। সত্যই, অ্যারের নামগুলি অ্যারের প্রথম উপাদানটির কাছে কনস্ট পয়েন্টার। কেবলমাত্র আপনি যদি একটি স্বেচ্ছাসেবী বিন্দুতে অ্যাক্সেস করতে পারেন যেমন এটির অ্যারের অর্থ এটিই নয় ... আপনি অ্যাক্সেস লঙ্ঘন পেতে পারেন :)
rmeador

2
পয়েন্টারগুলি অ্যারে হয় না। কমপ্লেক্স.এফএইউএর 6 টি বিভাগ পড়ুন ।
কিথ থম্পসন

পয়েন্টারগুলি আসলে অ্যারে হয় না। এছাড়াও, কাঁচা অ্যারেতে খুব বেশি ব্যবহার নেই - অবশ্যই সি ++ 11 এর পরে নয় std::array
einpoklum

@ আইনপোকলুম - পয়েন্টারগুলি রেফারেন্স অপারেশনে সমান হতে এবং অ্যারেগুলির মাধ্যমে পুনরাবৃত্ত হওয়ার পক্ষে যথেষ্ট পরিমাণে :) .... এছাড়াও - ২০০৮ সালে এই উত্তরটি লেখা হয়েছিল যখন সি ++ 11 প্রকাশের থেকে 3 বছর দূরে ছিল
ওয়ারেন

@ ওয়ারেন: পয়েন্টারগুলি অ্যারে হয় না বা অ্যারের কাছাকাছি হয় না, তারা কেবল অ্যারেগুলিতে ক্ষয় হয়। লোকেদের অনুরূপ যে এটি বলা প্যাডোগোগিকভাবে অনুচিত। এছাড়াও, আপনার অবশ্যই অ্যারে সম্পর্কিত রেফারেন্স থাকতে পারে, যা পয়েন্টারগুলির মতো একই ধরণের নয় এবং আকারের তথ্য বজায় রাখে; দেখতে এখানে
einpoklum

9

পয়েন্টারগুলি অনেকগুলি ডেটা স্ট্রাকচারে গুরুত্বপূর্ণ যার নকশার জন্য দক্ষতার সাথে একটি "নোড" কে অন্যের সাথে লিঙ্ক করার বা চেন করার দক্ষতা প্রয়োজন। আপনি কোনও পয়েন্টারকে "চয়ন" করতে পারবেন না যেমন ভাসমানের মতো একটি সাধারণ ডেটা টাইপ বলে, তাদের সহজ উদ্দেশ্য রয়েছে।

পয়েন্টারগুলি দরকারী যেখানে আপনার উচ্চ কার্যকারিতা এবং / অথবা কমপ্যাক্ট মেমরির পদচিহ্ন প্রয়োজন।

আপনার অ্যারেতে প্রথম উপাদানটির ঠিকানা একটি পয়েন্টারকে বরাদ্দ করা যেতে পারে। এরপরে আপনাকে অন্তর্নিহিত বরাদ্দ করা বাইটগুলি সরাসরি অ্যাক্সেস করতে দেয়। একটি অ্যারের পুরো পয়েন্ট হ'ল যদিও এটি করার প্রয়োজন হয় না।


9

ভেরিয়েবলের উপর পয়েন্টার ব্যবহার করার একটি উপায় হ'ল ডুপ্লিকেট মেমরিটি অপসারণ করা। উদাহরণস্বরূপ, আপনার যদি কিছু বড় জটিল অবজেক্ট থাকে তবে আপনি প্রতিটি রেফারেন্সের জন্য সেই পরিবর্তনশীলটিকে নির্দেশ করতে পয়েন্টার ব্যবহার করতে পারেন। একটি চলক সহ, আপনার প্রতিটি অনুলিপিটির জন্য মেমরির নকল করতে হবে।


এটি পয়েন্টার নয়, রেফারেন্সগুলি (বা সর্বাধিক - রেফারেন্স মোড়কে) ব্যবহার করার একটি কারণ।
einpoklum

6

C ++, আপনি উপপ্রকার ব্যবহার করতে চান তাহলে পলিমরফিজম , আপনি আছে পয়েন্টার ব্যবহার করতে। এই পোস্টটি দেখুন: সি ++ পয়েন্টার ছাড়াই পলিমারফিজম

সত্যিই, আপনি যখন এটি সম্পর্কে চিন্তা করেন, তখন এটি বোধগম্য হয়। আপনি যখন সাব-টাইপ পলিমারফিজম ব্যবহার করেন, শেষ পর্যন্ত আপনি জানেন না যে কোন শ্রেণীর বা সাবক্লাসের পদ্ধতিটি প্রয়োগ করা হবে, কারণ আপনি জানেন না যে আসল শ্রেণিটি কী।

কোনও অজানা শ্রেণীর অবজেক্ট ধারণ করে এমন একটি ভেরিয়েবল থাকার এই ধারণাটি সি ++ এর ডিফল্ট (নন-পয়েন্টার) স্ট্যাকের উপর অবজেক্টগুলি সংরক্ষণের মোডের সাথে সামঞ্জস্যপূর্ণ নয়, যেখানে বরাদ্দ করা জায়গার পরিমাণটি সরাসরি শ্রেণীর সাথে মিলে যায়। দ্রষ্টব্য: যদি কোনও শ্রেণীর 3 টির তুলনায় 5 টি ক্ষেত্র ক্ষেত্র থাকে, তবে আরও স্থান বরাদ্দ করতে হবে।


মনে রাখবেন যে আপনি যদি '&' ব্যবহার করে রেফারেন্সের মাধ্যমে আর্গুমেন্টগুলি পাস করতে চান, তখনও পর্দার আড়ালে অন্তর্নিহিত (অর্থাত্ পয়েন্টার) জড়িত। '&' কেবল সিনট্যাকটিক চিনি যা (1) আপনাকে পয়েন্টার সিনট্যাক্স ব্যবহারের ঝামেলা বাঁচায় এবং (2) সংকলকটিকে আরও কঠোর হতে দেয় (যেমন নাল পয়েন্টার নিষিদ্ধ)।


না, আপনি না আছে পয়েন্টার ব্যবহার করতে - আপনি রেফারেন্স ব্যবহার করতে পারেন। এবং আপনি যখন লেখেন "পয়েন্টারগুলি পর্দার অন্তর্ভুক্ত থাকে" - এটি অর্থহীন। gotoলক্ষ্য মেশিনের নির্দেশাবলীতে - পর্দার আড়ালে নির্দেশাবলীও ব্যবহৃত হয়। আমরা এখনও সেগুলি ব্যবহার করার দাবি করি না।
einpoklum

@ einpoklum-reinstateMonica আপনার যদি এমন কিছু অবজেক্টের সেট থাকে যা আপনি কাজ করতে চান, প্রতিটি উপাদানকে অস্থায়ী ভেরিয়েবলের পরিবর্তে বরাদ্দ করেন এবং সেই ভেরিয়েবলটিতে একটি পলিমারফিক পদ্ধতি কল করে থাকেন, তবে হ্যাঁ আপনাকে পয়েন্টার লাগবে কারণ আপনি কোনও রেফারেন্স পুনরায় প্রত্যাবর্তন করতে পারবেন না।
সিলডোরথ

যদি আপনার উত্পন্ন শ্রেণীর কাছে একটি বেস শ্রেণীর রেফারেন্স থাকে এবং সেই রেফারেন্সটিতে ভার্চুয়াল পদ্ধতিতে কল করেন, তবে প্রাপ্ত উত্পন্ন শ্রেণিকে 'ওভাররাইড' বলা হবে। আমি কি ভূল?
einpoklum

@ einpoklum-reinstateMonica এটি সঠিক। তবে যা অবজেক্ট রেফারেন্স করা হয়েছে তা আপনি পরিবর্তন করতে পারবেন না। সুতরাং আপনি যদি এই বিষয়গুলির একটি তালিকা / সেট / অ্যারে লুপ করছেন তবে একটি রেফারেন্স ভেরিয়েবল কাজ করবে না।
সিলডোরথ

5

কারণ সমস্ত জায়গাগুলিতে বড় বড় জিনিসগুলি অনুলিপি করা সময় এবং স্মৃতি অপচয় করে।


4
এবং পয়েন্টার কীভাবে এটিতে সহায়তা করে? আমি মনে করি জাভা থেকে আসা কোনও ব্যক্তি বা। নেট স্ট্যাক এবং হিপগুলির মধ্যে পার্থক্য জানেন না, সুতরাং এই উত্তরটি বেশ বেহুদা ..
ম্যাট ফ্রেডরিকসন

আপনি রেফারেন্স দিয়ে পাস করতে পারেন। এটি অনুলিপি প্রতিরোধ করবে।
মার্টিন ইয়র্ক

1
@ ম্যাটফ্রেড্রিকসন - একটি বৃহত ডেটা কাঠামো পাস করার (অনুলিপি করা) এবং ফলাফলটি আবার কপি করার পরিবর্তে আপনি কেবল এটি কোথায় র‌্যামে আছেন তা নির্দেশ করুন এবং তারপরে এটি সরাসরি সংশোধন করুন।
জন ইউ

সুতরাং বড় বস্তু অনুলিপি করবেন না। কেউ বলেনি যে এর জন্য আপনার পয়েন্টার দরকার।
einpoklum

5

এখানে আমার আনসার, এবং আমি কোনও বিশেষজ্ঞ হওয়ার প্রতিশ্রুতি দেব না, তবে আমি লেখার চেষ্টা করছি এমন আমার লাইব্রেরিতে আমি পয়েন্টারগুলি দুর্দান্ত বলে খুঁজে পেয়েছি। এই লাইব্রেরিতে (এটি ওপেনজিএল :-) সহ একটি গ্রাফিক্স এপিআই) আপনি তাদের মধ্যে প্রান্তিক বস্তুগুলির সাথে একটি ত্রিভুজ তৈরি করতে পারেন। অঙ্কন পদ্ধতিতে এই ত্রিভুজ অবজেক্টগুলি গ্রহণ করা হয় এবং ভালভাবে .. এগুলি আমার তৈরি ভারটিেক্স অবজেক্টের উপর ভিত্তি করে এঁকে দেয়। ঠিক আছে, ঠিক আছে।

তবে, আমি যদি একটি ভার্টেক্স সমন্বয় পরিবর্তন করি? ভার্টেক্স ক্লাসে এটি বা মুভিএক্স () দিয়ে কিছু সরান? আচ্ছা, ঠিক আছে, এখন আমাকে ত্রিভুজটি আপডেট করতে হবে, আরও পদ্ধতি যুক্ত করা এবং কার্যকারিতা নষ্ট হচ্ছে কারণ আমাকে প্রতিবার একটি শীর্ষবিন্দু সরিয়ে ত্রিভুজটি আপডেট করতে হবে। এখনও বড় বিষয় নয়, তবে এটি এত দুর্দান্ত নয়।

এখন, আমার কাছে যদি অনেক টান এবং দ্বিগুণ ত্রিভুজযুক্ত জাল থাকে এবং জালটি ঘোরানো হয়, এবং চলমান হয় এবং এ জাতীয়। আমাকে এই ত্রিভুজগুলি ব্যবহার করে এমন প্রতিটি ত্রিভুজ এবং সম্ভবত দৃশ্যের প্রতিটি ত্রিভুজ আপডেট করতে হবে কারণ আমি জানতাম না যে কোনটি কোনটি উল্লম্ব ব্যবহার করে। এটি প্রচুর কম্পিউটারের নিবিড়, এবং যদি আমার কোনও ল্যান্ডস্কেপের উপরে বেশ কয়েকটি মেস থাকে তবে godশ্বর! আমি সমস্যায় আছি, কারণ প্রতিটি ত্রিভুজ প্রায় প্রতিটি ফ্রেম আপডেট করে চলেছি কারণ এই উল্লম্বগুলি সময় বদলে যাচ্ছে!

পয়েন্টার সহ, আপনাকে ত্রিভুজগুলি আপডেট করতে হবে না।

আমার যদি ত্রিভুজ শ্রেণিতে প্রতি তিনটি ভার্টেক্স অবজেক্ট থাকে তবে আমি কেবল ঘরটি সংরক্ষণ করি না কারণ একটি জিলিয়ন ত্রিভুজের তিনটি ভার্টেক্স বস্তু থাকে না যা সেগুলি নিজেই বড় হয়, তবে এই পয়েন্টারগুলি সর্বদা তাদের ভার্টিক্সগুলিকে নির্দেশ করে যা তারা বোঝায় না কেন কত ঘন ঘন উল্লম্ব পরিবর্তন হয়। যেহেতু পয়েন্টারগুলি এখনও একই ভার্টেক্সে নির্দেশ করে, ত্রিভুজগুলি পরিবর্তন হয় না এবং আপডেট প্রক্রিয়াটি পরিচালনা করা সহজ is আমি যদি আপনাকে বিভ্রান্ত করি তবে আমি সন্দেহ করব না, আমি বিশেষজ্ঞ হওয়ার ভান করি না, কেবল আমার দুটি সেন্টকে আলোচনায় ফেলে দিই।


4

সি ভাষায় পয়েন্টারগুলির প্রয়োজনীয়তা এখানে বর্ণিত হয়েছে

মূল ধারণাটি হ'ল ভাষার অনেক সীমাবদ্ধতা (যেমন অ্যারে ব্যবহার করে স্ট্রিংগুলি এবং ফাংশনগুলিতে একাধিক ভেরিয়েবলগুলি সংশোধন করা) ডেটার মেমরির অবস্থানগুলির সাথে কারসাজি করে মুছে ফেলা যেতে পারে। এই সীমাবদ্ধতাগুলি কাটিয়ে উঠতে সি তে পয়েন্টার চালু করা হয়েছিল were

আরও এটিও দেখা যায় যে পয়েন্টার ব্যবহার করে আপনি আপনার কোডটি দ্রুত চালাতে পারেন এবং আপনি কোনও ফাংশনে বড় ডেটা ধরণের (অনেক ক্ষেত্রের সাথে কাঠামোর মতো) পাস করার ক্ষেত্রে মেমরি সংরক্ষণ করতে পারেন। পাস করার আগে এই জাতীয় ডেটা ধরণের একটি অনুলিপি তৈরি করা সময় লাগবে এবং স্মৃতি গ্রাস করবে। প্রোগ্রামাররা বড় ডেটা ধরণের জন্য পয়েন্টার পছন্দ করে কেন এটি অন্য কারণ।

PS: দয়া করে নমুনা কোড সহ বিশদ ব্যাখ্যার জন্য সরবরাহিত লিঙ্কটি উল্লেখ করুন ।


প্রশ্নটি সি ++ সম্পর্কে, এই উত্তরটি সি সম্পর্কে
einpoklum

নাহ, প্রশ্ন ট্যাগ করা হয় সি এবং সি ++। হয়তো সি ট্যাগ অপ্রাসঙ্গিক তবে এটি শুরু থেকেই এখানে here
জিন-ফ্রান্সোইস ফ্যাব্রে

3

জাভা এবং সি # তে সমস্ত অবজেক্টের রেফারেন্স পয়েন্টার হয়, সি ++ সহ জিনিসটি আপনি যেখানে পয়েন্টার করেন সেখানে আপনার আরও নিয়ন্ত্রণ থাকে। মহান শক্তি সঙ্গে মনে রাখবেন মহান দায়িত্ব আসে।


1

আপনার দ্বিতীয় প্রশ্ন সম্পর্কে, সাধারণত প্রোগ্রামিং করার সময় আপনাকে পয়েন্টার ব্যবহার করার প্রয়োজন হয় না, তবে এটির ব্যতিক্রম আছে এবং তা যখন আপনি পাবলিক এপিআই তৈরি করেন।

সি ++ এর সাথে সমস্যাগুলি যা লোকেরা সাধারণত পয়েন্টারগুলি প্রতিস্থাপন করতে ব্যবহার করে আপনি যে টুলসেটটি ব্যবহার করেন তার উপর খুব নির্ভর করে যখন আপনার উত্স কোডের উপর আপনার সমস্ত নিয়ন্ত্রণ থাকে তবে উদাহরণস্বরূপ আপনি যদি ভিজ্যুয়াল স্টুডিও ২০০৮ সহ একটি স্ট্যাটিক লাইব্রেরি সংকলন করেন এবং এটি একটি ভিজ্যুয়াল স্টুডিও 2010 এ ব্যবহার করার চেষ্টা করুন আপনি এক টন লিঙ্কার ত্রুটি পাবেন কারণ নতুন প্রকল্পটি এসটিএল এর একটি নতুন সংস্করণের সাথে সংযুক্ত, যা পিছনের দিকে সামঞ্জস্যপূর্ণ নয়। আপনি যদি কোনও ডিএলএল সংকলন করেন এবং একটি আমদানি গ্রন্থাগার দেন যা লোকেরা অন্য একটি টুলসেটে ব্যবহার করে তবে বিষয়গুলি আরও তত্পর হয়ে উঠবে কারণ সে ক্ষেত্রে আপনার প্রোগ্রামটি অচিরেই বা অকারণে কোনও আপাত কারণ ছাড়াই ক্রাশ হবে will

সুতরাং একটি লাইব্রেরি থেকে অন্যটিতে বড় ডেটা সেটগুলি সরিয়ে নেওয়ার উদ্দেশ্যে আপনি যদি ফাংশনটিতে একটি অ্যারের কাছে একটি পয়েন্টার দেওয়ার কথা বিবেচনা করতে পারেন যা আপনি অন্যদেরকে একই সরঞ্জামগুলি ব্যবহার করতে বাধ্য করেন না যদি আপনি সেই একই সরঞ্জামগুলি ব্যবহার করতে বাধ্য করেন না । এ সম্পর্কে ভাল অংশটি হ'ল এটি এমনকি সি-স্টাইলের অ্যারেও হবে না, আপনি একটি স্টাডি :: ভেক্টর ব্যবহার করতে পারেন এবং উদাহরণ হিসাবে প্রথম উপাদান এবং ভেক্টর [0] এর ঠিকানা দিয়ে পয়েন্টারটি দিতে পারেন এবং ব্যবহার করতে পারেন std :: ভেক্টর অভ্যন্তরীণভাবে অ্যারে পরিচালনা করতে।

সি ++ তে পয়েন্টার ব্যবহারের আরেকটি ভাল কারণ আবার গ্রন্থাগারগুলির সাথে সম্পর্কিত, আপনার প্রোগ্রামটি চলাকালীন লোড করা যায় না এমন একটি ডেলিকে বিবেচনা করুন, সুতরাং আপনি যদি কোনও আমদানি গ্রন্থাগার ব্যবহার করেন তবে নির্ভরতা সন্তুষ্ট হয় না এবং প্রোগ্রামটি ক্র্যাশ হয়। উদাহরণস্বরূপ এটি যখন আপনি নিজের অ্যাপ্লিকেশনটির পাশাপাশি একটি ডিলে একটি সর্বজনীন এপি দেন এবং আপনি অন্যান্য অ্যাপ্লিকেশন থেকে এটি অ্যাক্সেস করতে চান। এই ক্ষেত্রে এপিআই ব্যবহার করার জন্য আপনাকে তার অবস্থান থেকে ডিএল লোড করতে হবে (সাধারণত এটি একটি রেজিস্ট্রি কীতে থাকে) এবং তারপরে ডিএলএল এর ভিতরে ফাংশনগুলি কল করতে আপনাকে একটি ফাংশন পয়েন্টার ব্যবহার করতে হবে to কখনও কখনও লোকেরা যে এপিআই তৈরি করে তারা আপনাকে এই। एच ফাইল দেওয়ার জন্য যথেষ্ট দুর্দান্ত হয় যাতে এই প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে চালিত করতে এবং আপনার প্রয়োজনীয় সমস্ত ফাংশন পয়েন্টারগুলি দিতে,


1
  • কিছু ক্ষেত্রে, ফাংশন পয়েন্টারগুলিকে একটি ভাগ করা লাইব্রেরিতে (.DLL বা .so) ফাংশনগুলি ব্যবহার করতে হবে। এর মধ্যে ভাষা জুড়ে পারফর্মিং স্টাফ অন্তর্ভুক্ত রয়েছে, যেখানে প্রায়শই একটি ডিএলএল ইন্টারফেস সরবরাহ করা হয়।
  • সংকলক তৈরি করা হচ্ছে
  • বৈজ্ঞানিক ক্যালকুলেটর তৈরি করছেন, যেখানে আপনার কাছে একটি অ্যারে বা ভেক্টর বা ফাংশন পয়েন্টারের স্ট্রিং ম্যাপ রয়েছে?
  • আপনার নিজের গ্রাফিক্স প্যাকেজ তৈরি করে সরাসরি ভিডিও মেমরিটি সংশোধন করার চেষ্টা করছেন
  • একটি এপিআই তৈরি!
  • ডেটা স্ট্রাকচার - আপনার তৈরি বিশেষ গাছগুলির জন্য নোড লিঙ্ক পয়েন্টার

পয়েন্টারগুলির জন্য প্রচুর কারণ রয়েছে। আপনি যদি ক্রস-ল্যাঙ্গুয়েজের সামঞ্জস্য বজায় রাখতে চান তবে সিএল ম্যাঙ্গেলিং থাকা বিশেষত ডিএলএলগুলিতে গুরুত্বপূর্ণ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.