- সাধারণ চলকগুলির উপরে পয়েন্টার কেন ব্যবহার করবেন?
সংক্ষিপ্ত উত্তর: না। ;-) যেখানে আপনি অন্য কিছু ব্যবহার করতে পারবেন না সেখানে পয়েন্টার ব্যবহার করতে হবে। এটি হয় উপযুক্ত কার্যকারিতার অভাব, ডাটা প্রকারের অনুপস্থিত বা খাঁটি পারফোমেন্সের কারণে। আরও নীচে ...
- আমার কখন এবং কোথায় পয়েন্টার ব্যবহার করা উচিত?
এখানে সংক্ষিপ্ত উত্তর হ'ল: যেখানে আপনি অন্য কিছু ব্যবহার করতে পারবেন না। সি তে আপনার কাছে স্ট্রিংয়ের মতো জটিল ডেটাটাইপগুলির জন্য কোনও সমর্থন নেই। কোনও ফাংশনে "রেফারেন্স দ্বারা" ভেরিয়েবল পাস করার কোনও উপায় নেই। আপনি পয়েন্টার ব্যবহার করতে হবে যেখানে। এছাড়াও আপনি তাদেরকে ভার্চুয়াল কোনও কিছু, লিঙ্কযুক্ত তালিকাগুলি, স্ট্রাইকগুলির সদস্য এবং এগুলি নির্দেশ করতে পারেন। তবে আসুন এখানে 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);
মনে রাখবেন যে আপনি বরাদ্দ মেমরির একটি ফ্রি () সঞ্চালনের পরেও আপনি ভেরিয়েবল এক্সটি ব্যবহার করতে পারেন তবে সেখানে কী রয়েছে তা আপনি জানেন না। এছাড়াও লক্ষ্য করুন যে দুটি প্রিন্টফ () আপনাকে আলাদা আলাদা ঠিকানা দিতে পারে, যেহেতু মেমরির দ্বিতীয় বরাদ্দ প্রথম স্থান হিসাবে একই জায়গায় সঞ্চালিত হয় তার কোনও গ্যারান্টি নেই।