[]] অপারেটরের পরিবর্তে পয়েন্টার গাণিতিকের মাধ্যমে অ্যারে উপাদানগুলিতে অ্যাক্সেস করা কি খারাপ?


12

আমি সবেমাত্র সি তে প্রোগ্রামিং শিখতে শুরু করেছি এবং পয়েন্টার এবং অ্যারে সম্পর্কে আমার বোঝার উন্নতি করতে আমি বিন্দুতে কোনও পয়েন্টার তৈরি না করেই অ্যারের উপাদানগুলিকে উল্লেখ করার চেষ্টা করেছি:

for(k1 = 0; k1 < ROW; k1++){
    for(k2 = 0; k2 < COLUMN; k2++){

        array[k1][k2] = k1*COLUMN + k2 + 1;

        printf("[%d][%d] = %d\n", k1, k2, *(array[k1] + k2));

    }
}

সম্পূর্ণ কোডটি সংকলন করে এবং নির্বিঘ্নে চলমান।

আমি কল্পনা করেছিলাম যে একটি বড় উত্স কোডে প্রতিটি একক অ্যারের জন্য একটি পয়েন্টার তৈরি করা খুব উচ্চ অক্ষম বলে মনে হচ্ছে।

সুতরাং, পয়েন্টার ব্যবহার করে কোনও অ্যারের ঠিকানা সঞ্চয় এবং পুনরুদ্ধার করার পরিবর্তে, উপরে বর্ণিতভাবে, অ্যারের ঠিকানাটি সরাসরি ব্যবহার করা কি কোনও খারাপ প্রোগ্রামিং অনুশীলন?


ব্যবহার printf "[%d][%d] = %d\n", k1, k2, array[k1] [k2]));পয়েন্টার arithmic এড়াতে হবে এবং বুঝতে সহজ।
ক্যাস্পার ভ্যান ডেন বার্গ

1
হাহাহা, আপনি আমাকে পেয়েছেন। পয়েন্টার এবং অ্যারে কীভাবে কাজ করে সে সম্পর্কে আরও ভাল ধারণা অর্জনের জন্য আমি এটি কেবল পরীক্ষামূলক হিসাবে করেছি।
নিকো গাম্বট

পয়েন্টার গাণিতিক অ্যারে সূচকগুলি ব্যবহার করার চেয়ে প্রায় 30% দ্রুত।
অ্যান্ডি

উত্তর:


16

এটি "খারাপ" কেবলমাত্র যে পরিমাণে কম পাঠযোগ্য। a[x]একই জিনিস *(a+x), তাই দক্ষতা বা আচরণের মধ্যে কোনও পার্থক্য নেই (বাস্তবে, x[a]এটিও কাজ করবে)। এটি a[x]সাধারণত আমাদের মানুষের কাছে অনেক বেশি স্বজ্ঞাত।

তবে এটি বলার অপেক্ষা রাখে না যে পাঠযোগ্যতা কোনও বড় বিষয় নয়। কত বড় তা দেখতে, এই দুটি এক্সপ্রেশনটি আপনি কোডে দেখলে আপনি কীভাবে "পড়বেন" তা ভেবে দেখুন:

  • *(a+x)= "জিনিসটি নির্দেশক aএবং পূর্ণসংখ্যার যোগফল দ্বারা নির্দেশিত x"
  • a[x]= " xঅ্যারের তম সদস্য a"

একইভাবে, যখন আপনাকে কোনও অ্যারের উপাদানটির ঠিকানা উল্লেখ করতে হয়:

  • (a+x)= "পয়েন্টার aএবং পূর্ণসংখ্যার যোগফল x"
  • &a[x]= " xঅ্যারের তম সদস্যের ঠিকানা a"

বেশিরভাগ সময়, []সংস্করণগুলি বোঝার জন্য সহজ হয় যখন আপনি নানান তুচ্ছ কোডটি বিভিন্ন বিভিন্ন অ্যারে (বিশেষত অ্যারেগুলির অ্যারে) তে অপারেটিং দেখছেন। এজন্য []অপারেটরটি প্রথম স্থানে রয়েছে।

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


এই. ধন্যবাদ. আমি ঠিক বুঝতে পেরেছি যে আমি সত্যই যা জানতে চাই তা হ'ল কিনা, যখন কোনও অ্যারের উপাদানটির ঠিকানা উল্লেখ করার প্রয়োজন হয়, এবং তারপরে অন্য উপাদানটির ঠিকানা উল্লেখ করা হয় এবং অন্যটি, তখনও এটি কি খারাপ? কোনও পয়েন্টার ব্যবহার না করে এবং পরিবর্তে, অ্যারেটি সরাসরিভাবে আমি কীভাবে ব্যবহার করব? আমার এই প্রশ্নটি পিন পয়েন্ট করা সত্যিই কঠিন ছিল, এ কারণেই আমি ওপিতে এটি টাইপ করি নি। যাইহোক, যেহেতু আমি এটি জিজ্ঞাসা করি নি, আপনার উত্তর সন্তোষজনক।
নিকো গাম্বট

1
@ নিকোগ্যাম্বট আপনি সর্বদা অন্য প্রশ্ন জিজ্ঞাসা করতে পারেন =)
Ixrec

1
কি বলতে চাও তুমি শুধুমাত্র পরিমাণে ...? প্রোগ্রামিং ল্যাঙ্গুয়েজের পুরো পয়েন্টটি হল মানুষের পক্ষে পড়া সহজ করে দেওয়া to আমরা যদি সে সম্পর্কে যত্ন না রাখি তবে আমরা সকলেই হেক্সাডেসিমালে ওপ কোড লিখব।
সলোমন

2
অ্যারেগুলি পয়েন্টার নয়, স্পষ্টভাবে পয়েন্টারগুলির ক্ষয়।
কোডসইনচওস

4

হ্যাঁ, এটি খারাপ অভ্যাস, তবে অদক্ষতার কারণে নয়।

অ্যারে অপারেটর হুডের নীচে পয়েন্টার গাণিতিক ব্যবহার করে, তাই তারা সমান দক্ষ।

পয়েন্টার পাটিগণিতের সমস্যা হ'ল এটি খুব ত্রুটিযুক্ত এবং পড়া শক্ত read

থাম্বের বিধি: পয়েন্টার গাণিতিক ব্যবহার করবেন না যদি না আপনার প্রয়োজন হয়।


1
যেহেতু এটি পয়েন্টার গাণিতিক ব্যবহার যাইহোক, এর অর্থ কি পয়েন্টারগুলিও ততটা ততটা ত্রুটি-প্রবণ এবং পড়া শক্ত?
নিকো গাম্বট

1
@ নিকোগ্যাম্ব্ট সংকলকগুলি হুডের নীচে পয়েন্টার গাণিতিক করতে বেশ ভাল এবং খুব কমই 'ভুল' করবে; এটি প্রোগ্রামাররা যারা ফলাফল হিসাবে বাজে বাগের সাথে ভুল করবে।
ক্যাস্পার ভ্যান ডেন বার্গ

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

1
@ নিকোগ্যাম্বট এমন কিছু লেখা যা পারফরম্যান্সের উদ্দেশ্যে কম পাঠযোগ্য, প্রায়শই খারাপ অনুশীলন, তবে কোনও লাভের জন্য কম পাঠযোগ্য এমন কিছু লেখাই অস্পষ্টভাবে খারাপ অভ্যাস।
নিল

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

0

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

int *array[]; //This is a array to pointers of type *int. 

array[k1] + k2; //This is pointer arithmetic on one pointer stored in the array  

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

int array[y_dim*x_dim]; 
int index = x_dim*y + x; 
array[index]; //Gives you the element in x, y!

তার স্ট্রাইড হ'ল এক্স_ডিম। আশা করি আমার উত্তরটি স্পষ্ট হচ্ছে!


এটি int* array[ROW];কোনও int array[ROW][COLUMN];, বা একটি ব্যবহার করে কিনা তা ওপি থেকে পরিষ্কার নয় int (*array)[COLUMN];। এই তিনটি সংজ্ঞা উভয়েরই ওপিতে কোড সহ ব্যবহার করা যেতে পারে।
সিমেস্টার - মনিকা

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