রেফারেন্স সহ একটি অ্যারে পাস করা


184

রেফারেন্স কাজ করে স্থিতি বরাদ্দকৃত অ্যারে কীভাবে পাস করবেন?

void foo(int (&myArray)[100])
{
}

int main()
{
    int a[100];
    foo(a);
}

না (&myArray)[100]কোন অর্থ বা তার মাত্র একটি বাক্য গঠন রেফারেন্স দ্বারা কোনো অ্যারের পাস করতে হবে? আমি এখানে বড় বন্ধনী অনুসরণ করে পৃথক প্রথম বন্ধনী বুঝতে পারি না। ধন্যবাদ।


ফাংশন প্যারামিটারগুলির সাথে লভালুর সম্পর্ক রয়েছে কি?
জন ডিবি


উত্তর:


228

এটি অ্যারে রেফারেন্সের জন্য একটি বাক্য গঠন - আপনার (&array)রেফারেন্সের (অবৈধ) অ্যারের পরিবর্তে একটি অ্যারে রেফারেন্স চান এমন সংকলককে স্পষ্ট করতে আপনাকে ব্যবহার করতে হবে int & array[100];

সম্পাদনা: কিছু স্পষ্টতা।

void foo(int * x);
void foo(int x[100]);
void foo(int x[]);

এই তিনটি একই ফাংশনটি ঘোষণার বিভিন্ন উপায়। এগুলি সবাইকে int *প্যারামিটার গ্রহণ হিসাবে বিবেচনা করা হয় , আপনি তাদের কাছে যে কোনও আকারের অ্যারে দিতে পারেন।

void foo(int (&x)[100]);

এটি কেবলমাত্র 100 পূর্ণসংখ্যার অ্যারে গ্রহণ করে। আপনি নিশ্চিন্তে ব্যবহার করতে পারেন sizeofউপরx

void foo(int & x[100]); // error

এটি একটি "রেফারেন্সের অ্যারে" হিসাবে পার্স করা হয়েছে - যা আইনী নয়।


কেন আমরা উদাহরণের একটি অ্যারে থাকতে পারে না int a, b, c; int arr[3] = {a, b, c};?
ভোরাক

4
আহা, খুঁজে পাওয়া যায় নি কেন
ভোরাক

2
কেউ void foo(int & x[100]);দয়া করে কেন "রেফারেন্সের অ্যারে" হিসাবে পার্স করা যায় তা ব্যাখ্যা করতে পারেন ? "ডান থেকে বাম" নিয়মের কারণেই কি এটি? যদি হ্যাঁ, এটি void foo(int (&x)[100]);"অ্যারের রেফারেন্স" হিসাবে কীভাবে পার্স করা যায় তার সাথে এটি সামঞ্জস্যপূর্ণ নয় বলে মনে হয় । আগাম ধন্যবাদ.
zl9394

3
এটি ডান থেকে বামে নয়, এটি অভ্যন্তরে বাইরে রয়েছে এবং []] এর চেয়ে বেশি শক্ত করে বাঁধেন।
ফিলিপ্সি

48

এটি কেবল প্রয়োজনীয় বাক্য গঠন:

void Func(int (&myArray)[100])

intReference পরামিতিগুলির নাম উল্লেখ করে 100 এর অ্যারে পাস করুন myArray;

void Func(int* myArray)

An একটি অ্যারে পাস করুন। অ্যারে একটি পয়েন্টার স্থির করে। সুতরাং আপনি আকার তথ্য হারাবেন।

void Func(int (*myFunc)(double))

Function একটি ফাংশন পয়েন্টার পাস। ফাংশনটি একটি প্রদান করে intএবং একটি নেয় double। প্যারামিটারের নাম myFunc


একটি রেফারেন্স হিসাবে আমরা কীভাবে একটি পরিবর্তনশীল আকারের অ্যারে পাস করব?
শিবম অরোরা

@ শিভামআরোরা আপনি ফাংশনটি টেম্পলেটাইজ করুন এবং আকারটিকে একটি টেম্পলেট প্যারামিটার করুন।
মার্টিন ইয়র্ক

24

এটি একটি বাক্য গঠন। ফাংশনে আর্গুমেন্টগুলি int (&myArray)[100]বন্ধনীগুলি আবদ্ধ করা &myArrayআবশ্যক। যদি আপনি সেগুলি ব্যবহার না করেন তবে আপনি একটি পাস করবেন array of referencesএবং এটি কারণ এর subscript operator []চেয়ে বেশি উচ্চতর প্রাধান্য রয়েছে & operator

যেমন int &myArray[100] // array of references

সুতরাং, type construction ()আপনি কম্পাইলারটি ব্যবহার করে বলুন যে আপনি 100 পূর্ণসংখ্যার অ্যারের রেফারেন্স চান।

যেমন int (&myArray)[100] // reference of an array of 100 ints


"আপনি যদি এগুলি ব্যবহার না করেন তবে আপনি একটি পাস করবেন array of references" - যা অবশ্যই বিদ্যমান থাকতে পারে না, তাই আপনি একটি সংকলন ত্রুটি পেয়ে যাবেন। এটি আমার কাছে মজাদার যে অপারেটর অগ্রাধিকার নিয়মগুলি জোর দেয় যে এটি অবশ্যই ডিফল্টরূপে হওয়া উচিত happen
আন্ডারস্কোর_আগস্ট

টাইপ নির্মাণ সম্পর্কে আরও টিউটোরিয়াল আছে ()?
চিফ শিফটার

ধন্যবাদ, আমার এমন ব্যাখ্যার দরকার ছিল যা অপারেটর প্রাধান্য সম্পর্কে কারণ অন্তর্ভুক্ত করেছিল, এটি কেন এইভাবে করা উচিত তা বোঝায়।
cram2208

4

অ্যারে ডিফল্ট পয়েন্টার দ্বারা পাস করা হয়। আরও ভাল বোঝার জন্য আপনি একটি ফাংশন কলের মধ্যে একটি অ্যারে সংশোধন করার চেষ্টা করতে পারেন।


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

@ অলিরিচার্ড্ট আমি বলার চেষ্টা করছি যে "অ্যারেগুলি মান দিয়ে পাস করা যায় না" যেমনটি আপনি আগে বলেছিলেন, তারা রেফারেন্স দ্বারা ডিফল্ট পাস হয়েছে
এডুয়ার্ডো এ ফার্নান্দেজ দাজাজ

8
অ্যারে মান বা রেফারেন্স দ্বারা পাস হয় না। তারা পয়েন্টার দ্বারা পাস হয়। যদি অ্যারেগুলি ডিফল্টরূপে রেফারেন্স দিয়ে পাস করা হয় তবে সেগুলির আকার ব্যবহার করে আপনার কোনও সমস্যা হবে না। কিন্তু যে ক্ষেত্রে হয় না। কোনও ফাংশনে যাওয়ার সময় অ্যারে পয়েন্টারগুলিতে সিদ্ধান্ত নেয় dec
ব্যবহারকারী 3437460

2
অ্যারেগুলি রেফারেন্সের মাধ্যমে বা কোনও পয়েন্টারের অবনতির মাধ্যমে পাস করা যায়। উদাহরণস্বরূপ, ব্যবহার করে char arr[1]; foo(char arr[])., অর একটি পয়েন্টারের কাছে অবনমিত হয়; ব্যবহার করার সময় char arr[1]; foo(char (&arr)[1]), আরর একটি রেফারেন্স হিসাবে পাস করা হয়। এটি উল্লেখযোগ্য যে পূর্বের রূপটি প্রায়শই দুর্গঠিত হিসাবে বিবেচিত হয় যেহেতু মাত্রাটি হারিয়ে যায়।
zl9394

পুনরায়, "অ্যারেগুলি পয়েন্টারগুলি দিয়ে গেছে ..." এই বিবরণটি সর্বোপরি প্রচলিত মনে হচ্ছে এবং এটি নবজাতকদের কাছে বিভ্রান্তিকর হতে পারে। নাম একটি অ্যারের ভেরিয়েবলের, একটি বৈধ অভিব্যক্তি যার মান একটি পয়েন্টার অ্যারের প্রথম সদস্য। আপনার যদি কিছু ফাংশন থাকে foo(T* t)এবং আপনার একটি অ্যারে থাকে T a[N];তবে আপনি যখন লেখেন foo(a);আমি মনে করি এটি আরও সঠিক হবে যে আপনি পয়েন্টারটি পাস করছেন, একটি অ্যারে পাস করছেন না, এবং আপনি মান দ্বারা পয়েন্টারটি পাস করছেন।
সলোমন স্লো

1

নিম্নলিখিতটি একটি জেনেরিক ফাংশন তৈরি করে, রেফারেন্স অনুসারে যে কোনও আকারের এবং কোনও ধরণের অ্যারে গ্রহণ করে:

template<typename T, std::size_t S>
void my_func(T (&arr)[S]) {
   // do stuff
}

কোড দিয়ে খেলুন।

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