معنى - pointers in c++ شرح




صفائف هي مؤشرات؟ (5)

في C ++ (وفي C أيضا أعتقد)، صفيف ليس مؤشر والتي يمكن إثباتها على النحو التالي.

#include <iostream>
int main()
{
   char arr[1000];
   std::cout << sizeof arr;
}

إذا كان أر كان المؤشر هذا البرنامج سوف طباعة سيزوف (شار *) الذي هو عادة 4. لكنه يطبع 1000.

دليل آخر:

template <class T>
void f(T& obj)
{
   T x = obj; //this will fail to compile if T is an array type
}

int main()
{
   int a[30] = {};
   int* p = 0; 
   f(p); //OK
   f(a); //results in compile error. Remember f takes by ref therefore needs lvalue and no conversion applies
}

بشكل رسمي، يتم تحويل صفيف إلى مؤشر إلى العنصر الأول في تحويلات لفالو-رفالو، وهذا هو عندما يتم إعطاء لالفو من نوع صفيف في سياق عندما يتوقع رفالو، يتم تحويل المصفوفة إلى مؤشر إلى الأول جزء.

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

void f(int a[]);
void f(int a[10]);
void f(int* a);

هي ثلاثة إعلانات مكافئة. HTH

تكرار محتمل:
هو اسم صفيف مؤشر في C؟

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


في C ++ نوع الصفيف لديه "سمة الحجم"، لذلك ل

T a[10];
T b[20];

a و b أنواع مختلفة.

هذا يسمح لاستخدام التعليمات البرمجية مثل هذا

template<typename T, size_t N>
void foo(T (&a)[N])
{
   ...
}

لا، فإنها لا تنفذ بشكل مختلف. كلاهما يجد عناصر بنفس العملية الحسابية: a[i] في العنوان a + i*sizeof(a[0]) ، كما p[i] على العنوان p + i*sizeof(p[0]) .

ولكن، يتم التعامل معها بشكل مختلف من قبل نظام نوع . C ++ لديه معلومات الكتابة على المصفوفات التي يمكن رؤيتها من خلال sizeof operator (مثل C)، الاستدلال قالب، وظيفة التحميل الزائد، رتتي، وهلم جرا. في الأساس في أي مكان في اللغة التي تستخدم نوع المعلومات، فمن الممكن للمؤشرات والمصفوفات أن تتصرف بشكل مختلف.

هناك العديد من الأمثلة في C ++ حيث مفهوما لغة مختلفة لها نفس التنفيذ. فقط عدد قليل: صفائف مقابل مؤشرات، مؤشرات مقابل المراجع، وظائف افتراضية مقابل مؤشرات وظيفة، متكرر مقابل مؤشرات، للحلقات مقابل في حين حلقات، والاستثناءات مقابل لونغمب

في كل حالة، هناك بنية مختلفة وطريقة مختلفة للتفكير في المفهومين، ولكنها تؤدي إلى نفس رمز الجهاز في النهاية.


وأكبر نقطة من الارتباك بين المصفوفات والمؤشرات تأتي من قرار K & R لجعل معلمات الدالة التي يتم اعتبارها كنوع صفيف تتصرف كما لو أنها تم الإعلان عنها كمؤشرات. الإعلانات

void foo(int a[]);
و
void foo(int *a);
هي ما يعادلها، كما هو (بقدر ما أستطيع أن أقول)
void foo(int a[5]);
على الرغم من أنني لست إيجابيا المترجم سيكون مطلوبا لقبول إشارة إلى [6] ضمن هذه المهمة الأخيرة. في سياقات أخرى، يقوم تعريف صفيف بتخصيص مساحة لعدد العناصر المشار إليه. لاحظ أنه نظرا لما يلي:

typedef int foo[1];

فإن أي إعلان من نوع فو تخصيص مساحة لعنصر واحد، ولكن أي محاولة لتمرير فو كمعلمة وظيفة بدلا من ذلك تمرير العنوان. شيء من خدعة مفيدة تعلمت في دراسة تنفيذ va_list.


لا تعرف عن C ++. ل C، وجواب فاق إجابات أفضل بكثير مما كنت يمكن.

مقتطف صغير من c-فاق:

6.3 فما المقصود بعبارة `تكافؤ المؤشرات والمصفوفات 'في C؟

[...]

على وجه التحديد، حجر الزاوية في التكافؤ هو هذا التعريف الرئيسي:

تشير الإشارة إلى كائن من نوع صفيف من T الذي يظهر في تعبير تعطل (مع ثلاثة استثناءات) إلى مؤشر لعنصر الأول. نوع المؤشر الناتج هو مؤشر إلى T.

[...]







pointers