ما هو الفرق بين "char * A []" و "char ** A" في لغة C؟


الاجابه 1:

char * a [] عبارة عن مجموعة من المؤشرات لمتغيرات type char بينما char ** a تُعرّف المؤشر إلى متغير مؤشر متغير النوع char.

على سبيل المثال

char c = 'a'؛ // قيمة c = 2

char * p = & c؛

/ / يشير المؤشر p إلى متغير c

char ** pp = & p؛

// pp يشير إلى المؤشر p الذي يشير إلى المتغير c

لمزيد من المعلومات ، راجع عنوان URL: http: //www.thegeekstuff.com/2012 ...


الاجابه 2:

char * A [] عبارة عن صفيف ، و char ** A هو مؤشر. في C ، غالبًا ما تكون الصفيف والمؤشر قابلة للتبديل ، ولكن توجد بعض الاختلافات:

1. باستخدام "char * A []" ، لا يمكنك تعيين أي قيمة إلى A ، ولكن A [x] فقط ؛

باستخدام "char ** A" ، يمكنك تعيين قيمة إلى A و A [x] أيضًا.

2. باستخدام "char * A []" ، يمكنك تهيئة صفيف (مثل char * A [] = {"foo"، "bar"}؛) واستخدام sizeof (A) للحصول على الحجم (على 64 بت الجهاز ، يمنحك المثال أعلاه 16 لأنه صفيف اثنين char *)؛

مع "char ** A" ، ترجع sizeof (A) دائمًا حجم المؤشر (على جهاز 64 بت ، 8).


الاجابه 3:
  1. char * A [] تعني "مجموعة من المؤشرات إلى char" ، بينما char ** A تعني "مؤشر إلى مؤشر إلى char." لاحظ أن أول واحد يخبرك بوضوح أننا نعمل مع صفيف ، في حين أن الثانية لا تقدم مثل هذا الضمان. ومع ذلك ، من خلال البناء ، يكون كلاهما مكافئًا لـ C لأن صفيفًا يتم تخزينه كمؤشر للعنصر الأول في تلك المصفوفة. تعد صفيف المؤشرات مثيلًا خاصًا لمؤشر إلى مؤشر ؛ مؤشر إلى مؤشر ليس بالضرورة مجموعة من المؤشرات. للتدليل على ذلك ، لاحظ أنه ، بالنسبة إلى صفيف مؤشر مؤشر ، يمكنك تعيين char ** A = (char **) (void *) arrp ، لكن لا يمكنك (أي أنه يلقي خطأ في برنامج التحويل البرمجي) char * A [] = ( شار * []) ​​(باطل * []) ​​arrp. - في الواقع ، لا يمكنك إنشاء مثيل للصفيف وضبطه دون إعطاء وسيطة طول ، ولا يمكنك الإرسال إلى الصفائف أيضًا ، فقط المؤشرات

الاجابه 4:

الأول هو مؤشر [1] لعنصره الأول (ويعرف أيضًا باسم المصفوفة) ، والثاني يمكن أن يكون نوع المؤشر إلى مجموعة من سلاسل الأحرف [2] ، على سبيل المثال.

وبعبارة أخرى ، تتحلل الصفائف في المؤشرات على أي حال ، وبالتالي مجرد سكر نحوي (طالما أنك تتجاهل طلبات تخصيص الحجم في حالة الصفائف)

[1] على عكس int * ، char * هو نوع مؤشر عالمي.

[1] يتم تمرير السلاسل حولها كصفائف فارغة لاغية ، بحد ذاتها.

لمزيد من الأمثلة انظر

إجابة Ken Gregg على متى يجب تحديد مؤشرات مزدوجة في argv- في البرنامج الرئيسي C كوسيطة؟

إجابة سيرجي زوبكوف عن هل صفائف المصفوفات ممكنة في C؟

إجابة John L. Miller على هل صفائف المصفوفات ممكنة في C؟