مقدمة
لقد اتصلوا بي مؤخرًا بسؤال: "ما هو وكيفية استخدامها؟" ، مع عرض الكود التالي:
extern "C" { void byteMaskDowngrade(byte***const byteMask, const byte *const *const && source) {
كان هذا الزميل هو زميلي في العمل ، ولم نفهم على الفور ما تعنيه المعلمات بالضبط في إعلان الوظيفة (بالنسبة لأولئك المهتمين حيث قد تكون هناك حاجة إلى مثل هذا الإعلان: في التشفير).
وتحسبا للمشاكل المحتملة من الزملاء في ورشة العمل ، قررت إنشاء هذه المقالة ، ووضعها في ورقة الغش ، وهي الإجابة على سؤالين:
- كيف تكتب هذه الإعلانات هنا؟
- وكيفية قراءتها بشكل صحيح؟
"*"
الحالة مع النجمة الواحدة هي الأكثر شيوعًا ، ومع ذلك ، فهناك سوء فهم ممكن أيضًا هنا:
- كيف:
- لذلك:
const byte p;
- أو هكذا:
byte const p;
- أو في حالة الإدخال '*':
- لذلك:
byte *const p;
- أو هكذا:
const byte *p;
بالمعنى الدقيق للكلمة ، من وجهة نظر المترجم ، فإن وجود علامة النجمة وموقعها في التعبير يطرح سؤالاً مهماً بسبب المعنى النهائي للدخول سيكون مختلفا. لا يحدث وجود محدد المحددات في الحالة أعلاه أي فرق عند النظر في موضعه بالنسبة لنوع البيانات ، ومع ذلك ، فإن الموقف يتغير بشكل كبير عندما تظهر المؤشرات: واحد ، اثنان ، ثلاثة ... حسنًا ، أنت تفهم:
void p() {
كل هذا يبدو أكثر إثارة للاهتمام عندما يظهر المؤشر الثاني (هنا تتبع بالفعل قاعدة قراءة فعالة للكتابة):
void pp() {
كما ترون ، يمكن تمثيل مؤشر مزدوج بما يصل إلى 8 طرق مختلفة ، كل منها يحدد طريقة خاصة لاستخدام البيانات المستهدفة.
قواعد قراءة هذه التعبيرات هي كما يلي:
- ابحث عن علامة "=" في التعبير وقراءة التعبير من اليمين إلى اليسار ؛
- تخطي اسم المتغير ؛
- اجتماعات أخرى إما "*" ، مما يعني مؤشرًا منتظمًا أو "* const" - مؤشرًا ثابتًا ؛
- وبالتالي نقرأ حتى تتم مصادفة نوع البيانات (البايت) ؛
- والكلمة الأخيرة على يسار نوع البيانات يمكن أن تكون const ، ويعني وجودها أن هذا البناء بالكامل يشير إلى البيانات التي لا يمكن تغييرها ؛ إذا كان const ليس كذلك ، فمن الممكن.
هذا النوع من الكتابة والقراءة يجعل من السهل قراءة وفهم أكثر التعبيرات تطوراً)
فيما يلي مثال على مجموعة
كاملة من التعبيرات بمؤشر ثلاثي:
"***"
void ppp() {