السلسلة الحرفية تهيئة للحصول على مجموعة الأحرف

StackOverflow https://stackoverflow.com/questions/2036096

سؤال

في القواعد التالية للحالة عندما تتحلل الصفيف إلى المؤشر:

lvalue [انظر السؤال 2.5] من مجموعة من النوع من T-T الذي يظهر في تحلل التعبير (مع ثلاثة استثناءات) في مؤشر لعنصرها الأول؛ نوع المؤشر الناتج هو مؤشر إلى T.

(الاستثناءات هي عندما تكون الصفيف هو معامل Sizeof أو المشغل، أو هو تهيئة السلسلة الحرفية للحصول على صفيف حرف.)

كيفية فهم الحالة عندما تكون الصفيف هو "السلسلة الحرفية تهيئة صفيف حرف"؟ بعض المثال من فضلك.

شكرا!

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

المحلول

الاستثناءات الثلاثة التي لا تتحلل فيها الصفيف في المؤشر ما يلي:

استثناء 1. - عندما الصفيف هو المعامل sizeof.

int main()
{
   int a[10];
   printf("%zu", sizeof(a)); /* prints 10 * sizeof(int) */

   int* p = a;
   printf("%zu", sizeof(p)); /* prints sizeof(int*) */
}

استثناء 2. - عندما الصفيف هو معامل & المشغل أو العامل.

int main()
{
    int a[10];
    printf("%p", (void*)(&a)); /* prints the array's address */

    int* p = a;
    printf("%p", (void*)(&p)); /*prints the pointer's address */
}

استثناء 3. - عند تهيئة الصفيف بسلسلة حرفية.

int main()
{
    char a[] = "Hello world"; /* the literal string is copied into a local array which is destroyed after that array goes out of scope */

    char* p = "Hello world"; /* the literal string is copied in the read-only section of memory (any attempt to modify it is an undefined behavior) */
}

نصائح أخرى

افترض التصريحات

char foo[] = "This is a test";
char *bar  = "This is a test";

في كلتا الحالتين، نوع السلسلة الحرفية "This is a test"هو" صفيف "15 عنصر من Char". في معظم الحالات، يتم تحويل تعبيرات الصفيف ضمنيا من نوع "صفيف عنصر N من T" إلى "المؤشر إلى T"، والتعبير يقيم عنوان العنصر الأول من صفيف. في الإعلان ل bar, هذا هو بالضبط ما يحدث.

في الإعلان foo, ومع ذلك، فإن التعبير يستخدم لتهيئة المحتويات مجموعة أخرى، وبالتالي ليس تحويلها إلى نوع المؤشر؛ بدلا من ذلك، محتويات من السلسلة الحرفي يتم نسخها إلى foo.

هذه هي السلسلة الحرفية تهيئة للحصول على صفيف حرف:

char arr[] = "literal string initializer";

يمكن أن يكون أيضا:

char* str = "literal string initializer";

تعريف من K & R2:

سلسلة حرفية سلسلة، وتسمى أيضا سلسلة ثابتة، هي سلسلة من الأحرف المحاطة بنقلية مزدوجة كما في "...". تحتوي السلسلة على نوع `` مجموعة من الأحرف "وطبقة التخزين ثابتة (انظر par.a.3 أدناه) ويتم تهيئة الأحرف المحددة. سواء كانت حرفية سلسلة متطابقة متميزة يتم تعريف التنفيذ، وسلوك البرنامج الذي يحاول تغيير سلسلة حرفية غير محددة.

يبدو أنك سحبت هذا الاقتباس من الأسئلة الشائعة من comp.lang.c (ربما نسخة قديمة أو ربما النسخة المطبوعة؛ لا تتطابق تماما مع الحالة الحالية للآخر عبر الإنترنت):

http://c-faq.com/aryptr/aryptrealequib.html.

يرتبط القسم المقابل بأقسام أخرى من الأسئلة الشائعة لتوضيح تلك الاستثناءات. في حالتك، يجب عليك إلقاء نظرة على:

http://c-faq.com/decl/stlitinit.html.

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