سؤال

كود:

const char* const* const* foo(int bar);

لقد رأيت مضاعفا قبل ذلك يمنع تعديل المؤشر أيضا.في المرة الأولى التي رأيت فيها ثباتا ثلاثيا في حياتي.أتساءل ما هو استخدامه.

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

المحلول

في المثال الخاص بك جميع ولكن المستوى الأعلى من المراوغة جميع const مؤهل.

const char            /* const qualified base level */
    *const            /* const qualified level 1 */
    *const            /* const qualified level 2 */
    *                 /* regular level 3 */
    foo(int bar);

foo هي دالة تقبل ملف int حجة وإرجاع مؤشر منتظم.
المؤشر فإنه يعود نقطة إلى const مؤشر مؤهل
وهذا بدوره يشير إلى آخر const مؤشر مؤهل
الذي يشير إلى const مؤهل char

نصائح أخرى

إذا كان لديك مؤشر متعدد المستويات، فلديك متغيرات مؤشر عدة.مثال:

giveacodicetagpre. يتم الوصول إلى

مثل هذا:

giveacodicetagpre.

يمكنك التأهل لكل موقع من المواقع الأربعة في الذاكرة باعتباره const، كما هو الحال في الإعلان

giveacodicetagpre.

ومع ذلك، أفضل تجنب أن تصبح مبرمج ثلاث نجوم.

هاه-الارتباك حول const.

في الأساس ، إذا كان يؤهل المؤشر ، فإنه ينطبق على المؤشر مباشرة إلى يساره.على سبيل المثال:

char *const c;

يجعل c مؤشر للقراءة فقط إلى char, ، في حين

const char *c;

يجعل c مؤشر للقراءة فقط char, ، على الرغم من أنه يمكنك تغيير المكان c يشير إلى.

بالطبع ، يمكن جعل كل من المؤشر وما يشير إليه للقراءة فقط:

const char *const c;

هذا يجعل c مؤشر للقراءة فقط للقراءة فقط char.مع الإعلان السابق ، يمكنك تعديل *c, ، لكن لا يمكنك التعديل c (أي.لا يمكنك جعله يشير إلى مكان آخر).مع الثانية ، يمكنك تعيين ل c ولكن ليس ل *c, ، ومع الثالث ، لا يمكنك تعديل المكان الذي يشير إليه ، ولا يمكنك تعديل الكائن المدبب.

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

const char *const *const *foo(int bar);

مما يجعل foo إرجاع مؤشر إلى مؤشر للقراءة فقط إلى مؤشر للقراءة فقط إلى مؤشر للقراءة فقط char.اقرأ ذلك بعناية:لاحظ أنه بالنظر إلى هذه القطعة من التعليمات البرمجية:

const char *const *const *ptr = foo(0);

ثم أنت تعرف أن تعيين ل ptr هو قانوني ، ولكن أي مهمة أخرى غير قانونية ، وهي ، لا يمكنك تعيين ل *ptr, **ptr, ، و ***ptr.

foo إرجاع أ pointer الذي يشير إلى أ constant pointer الذي يشير إلى آخر constant pointer الذي يشير إلى أ constant char.إلقاء نظرة على قاعدة لولبية.

int bar;
const char* const* const* ptr = foo(bar);

لذلك في الأساس لا يمكنك تغيير أي من *ptr أو **ptr أو ***ptr.

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