سؤال

هل تم تمرير المصفوفات افتراضيًا حسب المرجع أو القيمة؟ شكرًا.

هل كانت مفيدة؟

المحلول

يتم تمريرها كمؤشرات. هذا يعني أن جميع المعلومات حول حجم الصفيف قد فقدت. سيكون من الأفضل لك استخدام ناقلات STD :: ، والتي يمكن تمريرها بالقيمة أو بالرجوع إليها ، كما تختار ، وبالتالي تحتفظ بجميع معلوماتها.

إليك مثال على تمرير صفيف إلى وظيفة. لاحظ أنه يتعين علينا تحديد عدد العناصر على وجه التحديد ، لأن حجم (P) سيعطي حجم المؤشر.

int add( int * p, int n ) {
   int total = 0;
   for ( int i = 0; i < n; i++ ) {
       total += p[i];
   }
   return total;
}


int main() {
    int a[] = { 1, 7, 42 };
    int n = add( a, 3 );
}

نصائح أخرى

أولاً ، لا يمكنك تمرير صفيف بالقيمة بمعنى أن نسخة من الصفيف قد تم إجراؤها. إذا كنت بحاجة إلى هذه الوظيفة ، فاستخدم std::vector أو boost::array.

عادة ، يتم تمرير مؤشر إلى العنصر الأول بالقيمة. يتم فقد حجم الصفيف في هذه العملية ويجب تمريره بشكل منفصل. التوقيعات التالية كلها متكافئة:

void by_pointer(int *p, int size);
void by_pointer(int p[], int size);
void by_pointer(int p[7], int size);   // the 7 is ignored in this context!

إذا كنت ترغب في المرور بالرجوع إليها ، فإن الحجم جزء من النوع:

void by_reference(int (&a)[7]);   // only arrays of size 7 can be passed here!

غالبًا ما تجمع بين التمرير بالرجوع إليه مع القوالب ، بحيث يمكنك استخدام الوظيفة بأحجام مختلفة معروفة بشكل ثابت:

template<size_t size>
void by_reference(int (&a)[size]);

أتمنى أن يساعدك هذا.

المصفوفات خاصة: يتم تمريرها دائمًا كمؤشر إلى العنصر الأول من الصفيف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top