سؤال

حتى رأيت هذا:

error:(NSError **)error

في أبل الطبيب.لماذا اثنين من النجوم ؟ ما هو المغزى ؟

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

المحلول

وA "نجم مزدوج" هو مؤشر إلى المؤشر. حتى NSError ** هو مؤشر إلى مؤشر إلى كائن من نوع NSError. ذلك أساسا يسمح لك بالعودة كائن خطأ من وظيفة. يمكنك إنشاء مؤشر إلى كائن NSError في وظيفة الخاص بك (الذي يطلق عليه *myError)، ثم تفعل شيئا مثل هذا:

*error = myError;

والى "العودة" هذا الخطأ إلى الطالب.


في الرد على تعليق نشرت أدناه:

وأنت لا يمكن ببساطة استخدام NSError * لأنه في C، يتم تمرير المعلمات وظيفة <م> حيث القيمة ، بمعنى أنه كانت القيم <م> نسخ عندما تم تمريرها إلى وظيفة. ولتوضيح ذلك، النظر في هذا مقتطف من شفرة C:

void f(int x)
{
    x = 4;
}

void g(void)
{
    int y = 10;
    f(y);
    printf("%d\n", y);    // Will output "10"
}

وندب من x في f() لا يؤثر على قيمة حجة خارج من f() (في g()، على سبيل المثال).

وبالمثل، عندما يتم تمرير مؤشر إلى وظيفة، يتم نسخ قيمتها، وسوف تعيد تكليف وليس تؤثر على قيمة خارج الدالة.

void f(int *x)
{
    x = 10;
}

void g(void)
{
    int y = 10;
    int *z = &y;
    printf("%p\n", z);    // Will print the value of z, which is the address of y
    f(z);
    printf("%p\n", z);    // The value of z has not changed!
}

وبطبيعة الحال، نحن نعلم أننا يمكن تغيير قيمة ما z نقطة بسهولة إلى حد ما:

void f(int *x)
{
    *x = 20;
}

void g(void)
{
    int y = 10;
    int *z = &y;
    printf("%d\n", y);    // Will print "10"
    f(z);
    printf("%d\n", y);    // Will print "20"
}

وهكذا فإنه من المعقول أنه لتغيير قيمة ما هي نقاط NSError * ل، لدينا أيضا لتمرير مؤشر إلى المؤشر.

نصائح أخرى

في C كل شيء يمر من حيث القيمة. إذا كنت ترغب في تغيير قيمة شيء يمكنك تمرير عنوان منه (الذي يمر قيمة عنوان الذاكرة). إذا كنت ترغب في تغيير مكان نقاط المؤشر التي تمر في المخاطبة من المؤشر.

نلقي نظرة هنا للحصول على شرح بسيط .

في C، نجمة مزدوجة هي مؤشر إلى المؤشر. هناك عدة أسباب للقيام بذلك. الأول هو أن المؤشر قد تكون إلى مجموعة من المؤشرات. سيكون هناك سبب آخر يتمثل في تمرير مؤشر إلى وظيفة، حيث يعدل وظيفة مؤشر (على غرار معلمة "خارج" في لغات أخرى).

والنجمة المزدوجة (**) تدوين ليست محددة لتهيئة متغير في فئة. بل هو مجرد اشارة غير مباشرة مزدوجة لكائن.

  float myFloat; // an object
    float *myFloatPtr; // a pointer to an object
    float **myFloatPtrPtr; // a pointer to a pointer to an object

    myFloat = 123.456; // initialize an object
    myFloatPtr = &myFloat; // initialize a pointer to an object
    myFloatPtrPtr = myFloatPtr; // initialize a pointer to a pointer to an object

    myFloat; // refer to an object
    *myFloatPtr; // refer to an object through a pointer
    **myFloatPtrPtr; // refer to an object through a pointer to a pointer
    *myFloatPtrPtr; // refer to the value of the pointer to the object

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

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

إذا كان أي شيء مثل C ثم ** يعني مؤشر إلى مؤشر.

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