সি / সি ++ এ পয়েন্টার ভেরিয়েবলগুলি ঘোষণার সঠিক উপায় [বন্ধ]


91

আমি লক্ষ্য করেছি কিছু লোক পয়েন্টার ভেরিয়েবলগুলি ঘোষণার জন্য নিম্নলিখিত স্বরলিপি ব্যবহার করে।

(a) char* p;

পরিবর্তে

(b) char *p;

আমি (খ) ব্যবহার করি। (ক) স্বরলিপি পিছনে যুক্তি কি? স্বরলিপি (খ) আমার কাছে আরও অর্থবোধ করে কারণ চরিত্র পয়েন্টারটি কোনও নিজস্ব নয়। পরিবর্তে প্রকারটি অক্ষর এবং ভেরিয়েবল অক্ষরটির পয়েন্টার হতে পারে।

char* c;

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

char* c, *d;

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

char *c, *d;

ধন্যবাদ


7
চর পয়েন্টারটি কোনও প্রকার নয় মানে কী? আপনি কি বলছেন যে পয়েন্টারটি কোনও প্রকার নয়?
বেনজামিন লিন্ডলি

4
আমি বিশ্বাস করি যদি আপনি কোনও নির্দিষ্ট শৈলীর গাইড না দেখেন (তবে আপনার সংস্থার একটি নির্দিষ্ট কোডিং মান থাকতে হবে যা আপনাকে অবশ্যই অনুসরণ করবেন) unless আমি এটি পছন্দ খ এবং মাঝখানে যেখানে কিছু মধ্যে মিশ্রিত হয়। কখনও কখনও আমি char *tসঠিক দেখাচ্ছে বলে মনে হয় না , তাই আমি char * t;পরিবর্তে এটি করতে পারি । তবে আমিও প্রায়শই দেখেছি char* t;
রাগ 2

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

4
উভয় এখনও পর্যাপ্ত বর্ণনামূলক, (খ) দেখায় * পি টাইপ করে charএবং (ক) pointer to a char
একজন ব্যক্তি

4
এক দশকেরও বেশি শিল্প অভিজ্ঞতার সাথে, আজ প্রথমবারের মতো এলো এবং কেবলমাত্র অন্যান্য শিল্প পেশাদারদের নিবন্ধগুলি পড়ার ক্ষেত্রে। স্পষ্টতই, তারপরও, আমি এগুলি সম্পর্কে কোনও ধর্মীয় কথোপকথনের মতো কিছু কখনই পাইনি, যেমন আমি ট্যাবগুলির সাথে ভি স্পেস, ডিএফ বা ডেস্কের মন্তব্য, বা অন্য কোনও "বিষয় নিয়ে তর্ক করার চেয়ে গুরুত্বপূর্ণ কিছু না থাকা ভাল good" । এটি আমার দৃষ্টিকোণ হিসাবে, আমি আমার ক্যারিয়ারের খেলায় এত দেরীতে পছন্দ করেছি, প্রায়শই "চর * পি" সাথে যেতে। হ্যাঁ, আগে স্থান, পরে স্থান। বেশিরভাগ ক্ষেত্রে যেমনটি আমি খুঁজে পাই এটি ত্রুটিগুলি হ্রাস করে, কারণ এটি পয়েন্টার-নেসকে আরও সুস্পষ্ট করে তোলে।
কিট 10

উত্তর:


102

বাজর্ন স্ট্রাস্ট্রাপ বলেছেন:

"ইনট * পি;" এর মধ্যে পছন্দ এবং "ইনট * পি;" সঠিক এবং ভুল সম্পর্কে নয়, শৈলী এবং জোর সম্পর্কে। সি এক্সপ্রেশন জোর দেওয়া; ঘোষণাগুলি প্রায়শই প্রয়োজনীয় মন্দের চেয়ে সামান্য বেশি বিবেচিত হত। অন্যদিকে, সি ++ এর ধরণের উপর প্রচুর জোর রয়েছে।

একটি "সাধারণ সি প্রোগ্রামার" লিখেছেন "ইনট * পি;" এবং এটিকে ব্যাখ্যা করে "* পি ইনট" কী তা "সিনট্যাক্সের উপর জোর দেয় এবং শৈলীর সঠিকতার জন্য যুক্তি দিতে সি (এবং সি ++) ঘোষণার ব্যাকরণকে নির্দেশ করতে পারে। প্রকৃতপক্ষে, * ব্যাকরণে পি নামটি আবদ্ধ করে।

একটি "সাধারণ সি ++ প্রোগ্রামার" লিখেছেন "ইনট * পি;" এবং এটিকে ব্যাখ্যা করে "পি একটি ইনট্রে পয়েন্টার" জোর দেওয়া প্রকারের। প্রকৃতপক্ষে পি টাইপটি ইনট *। আমি স্পষ্টভাবে সেই জোরটিকে পছন্দ করি এবং সি ++ এর আরও উন্নত অংশগুলি ব্যবহারের জন্য এটি গুরুত্বপূর্ণ হিসাবে দেখি।

সূত্র: http://www.stroustrup.com/bs_faq2.html#Witespace

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


34
অন্যরা একই ঘোষণায় কখনও কখনও বেশ কয়েকটি বস্তু ঘোষনা না করার পরামর্শ দেয়। :-)
বো পারসন

4
আমি সিনট্যাক্সের পিছনে যুক্তিটির উপর জোর দিয়েছি, সুতরাং আমি পছন্দ করি: int *pঅর্থ: যখন pঅবজ্ঞাপূর্ণ হয় তখন আমি একটি পাই int। তারপরে পৃথক পৃথক একাধিক ঘোষণাগুলি অর্থবোধ করে ,: int *p, *q, r(কখন pবা qসম্মানিত হয় আমি পাই int, কখন rরেফারেন্স পাই আমি পাই int)। এছাড়াও, ফাংশন পয়েন্টার বাক্য গঠন জ্ঞান করে তোলে: int (*f)()(যখন fdereferenced এবং বলা হয় আমি একজন পেতে int)। আর এই জ্ঞান করে তোলে: int *p, (*f)()
ড্রুউসুক্কার

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

4
@ ড্রুউসুকার, আপনার বক্তব্য উপরের যে কোনওটির চেয়ে বেশি অর্থবোধ করে, আমি মনে করি।
মুনতাশির আকন

4
@ ড্রুসুক্কার তবে যুক্তিটি হুবহু কাজ করে না void*(এবং সি ++ রেফারেন্সের জন্য মোটেও কাজ করে না)।
জেমসডলিন

57

আমি ব্যক্তিগতভাবে *বাকি প্রকারের সাথে স্থানটি পছন্দ করি

char* p;  // p is a pointer to a char.

লোকেরা তর্ক করবে "তবে তারপরে char* p, q;বিভ্রান্তিমূলক হয়ে ওঠে", যার কাছে আমি বলেছি, "সুতরাং এটি করবেন না"।


চর * পি এর জন্য খুব ভাল যুক্তি; পছন্দ :) ততক্ষণ আমি তাদের কারও আপত্তি করব না যতক্ষণ পড়তে পারা শক্ত হয় না আপনি যে উদাহরণে দেখিয়েছেন যে কোন ক্ষেত্রে তাদের এটি করা উচিত নয়।
যিশু রামোস

4
আপনি যখন মান আউটপুট করতে চান? তুমি cout << *p;। সুতরাং কেন তারকা নির্বাণ না সামনে p ঘোষণা সময়: *p? আমার মতে এটি কম বিভ্রান্তিকর হবে।
ব্যবহারকারী 1170330

13
@ ব্যবহারকারী ১১70০৩৩০, কারণ এটি একবারে টাইপ সংজ্ঞায়নের অংশ এবং এটি অন্যটিতে একটি ডিসিফারেন্স অপারেটর। সম্পর্ক নাই. যদি কিছু হয় তবে এটি ভাল জিনিস যা তারা আলাদা দেখায়, যেহেতু বিভিন্ন জিনিস আলাদা হওয়া উচিত।
ইকেগামি

33

কীভাবে লিখবেন তাতে কোনও পার্থক্য নেই। তবে আপনি যদি এক লাইনে দুই বা ততোধিক পয়েন্টার ভালভাবে ঘোষণা করতে চান (খ) বৈকল্পিক, কারণ আপনি কী চান তা পরিষ্কার it নীচে দেখো:

int *a;
int* b;      // All is OK. `a` is pointer to int ant `b` is pointer to int
char *c, *d; // We declare two pointers to char. And we clearly see it.
char* e, f;  // We declare pointer `e` and variable `f` of char type.
             // Maybe here it is mistake, maybe not. 
// Better way of course is use typedef:
typedef char* PCHAR;
PCHAR g, h;  // Now `g` and `h` both are pointers.
// If we used define construction for PCHAR we'd get into problem too.

4
typedef"অবশ্যই" এর চেয়ে ভাল উপায় নয়। কিছু লোক এটিকে পছন্দ করতে পারে তবে আপনার কোড সহ একাধিক ব্যক্তি কাজ করলে এটি সমস্যাযুক্ত। যদি আমি অভ্যস্ত না হয়ে থাকি তবে আমি PCHARএমন কিছু লিখতে পারি PCHAR *p;, যা char**আমার ইচ্ছা মতো নয়। সাধারণভাবে, আপনি যদি একটি চান char**, আপনাকে PCHAR*একটি নতুন টাইপ লিখতে বা সংজ্ঞায়িত করতে হবে এবং তারপরে এটি কেবল বোকা হয়ে উঠতে শুরু করে।
ব্ল্যাকজ্যাক

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

আপনি যদি চরটিতে একটি পয়েন্টার সংজ্ঞায়িত করার জন্য PCHAR * p লিখে থাকেন তবে স্পষ্ট হবে যে আপনি কী করছেন তা জানেন না এবং টাইপ ডিএফটি পড়েন নি। উত্তরটি তার মতে। টাইপিডেফের আরও একটি সুবিধা রয়েছে; সি এ জিনিসগুলি অস্বচ্ছ করতে সহজ উপায়। প্রকাশ্যে প্রতীককে ভিওআইডি পিটিআর হিসাবে সংজ্ঞায়িত করা হয়েছে, ব্যক্তিগতভাবে টাইপ ডিএফ অন্য কিছু .... আমি টাইপডেফকে একবারে সামঞ্জস্য করি তারপরে যখন আমরা কোনও প্রকারের বিষয়ে কিছু পরিবর্তন করি তখন কোডের মধ্যে সমস্ত কিছু সমন্বিত করে ... তবে সি ++ 11 এর বেশিরভাগ
অংশকে

কলেজের পাঁচ বছর পরে কারও কারও কাছে সরাসরি খেলনাতে ফিরে আসার চেষ্টা করা, এটি সেরা উত্তরগুলির মধ্যে একটি one
Panzercrisis

10

সমঝোতা হয়

char * p;

কে অ্যান্ড আর ব্যবহার করে

char *p;

আপনি যদি কোনও কোডিং মান অনুসরণ না করেন তবে এটি আপনার উপর নির্ভর করে - সেক্ষেত্রে, আপনার প্রত্যেকে যা যা করেন তা আপনার অনুসরণ করা উচিত।


4
আমি কঠোরভাবে শিখেছি যে চর * x, y এর অর্থ y নয় একটি চর * * এখন আমি দেখতে পাচ্ছি কেন কেন ওআরআর উল্লিখিত স্টাইলটি অনুসরণ করে।
রাহুল কাদুকর

কে অ্যান্ডআর কী এবং কোডের একক উত্স কী ব্যবহার করে তা বিবেচনা করে? আমি ব্যবহার char* p;। এটি স্টাইলের বিষয়, কনভেনশন বা নিয়ম নয়। আমার কাছে এটি আরও বোধগম্য করে যে পি টাইপ করেchar* টাইপযুক্ত, তাই স্পষ্টতই * টাইপের সাথে থাকা উচিত।
ফ্যালকোগার

@ ফ্যালকোগার আমি কেএন্ডআর-এর জন্য একটি লিঙ্ক যুক্ত করেছি। কোডের একক উত্স কী ব্যবহার করে তা বিবেচ্য নয়। আপনি যদি তাদের স্ট্যান্ডার্ড অনুসরণ না করেন তবে আপনার দলটি আপনাকে বিরক্ত করতে পারে কারণ আপনি তাদের কোড বুঝতে তাদের আরও কঠোর করে তুলছেন। এই দিনগুলিতে, আমি আশা করব যে দলগুলি clang-formatযেভাবেই ব্যবহার করছে ।
jnnnnn

2

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

আমি (খ) আরও সাধারণ বলে মনে করি এবং কিছু ক্ষেত্রে আমি দেখেছি

char * a;

বা এই জাতীয় কিছু। আবার পছন্দ। আমি যে প্রকল্পে কাজ করছি তার সাথে আপনি যে স্বাচ্ছন্দ্য বোধ করবেন না বা যা কিছু ব্যবহার করুন তা আমি ব্যবহার করব (যদি না আমি নিজে লিখি তবে আমি (ক))

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