مؤشر للفراغ في C++؟
-
03-07-2019 - |
سؤال
أنا أقرأ بعض التعليمات البرمجية في Ogre3D التنفيذ ولا أستطيع أن أفهم ما void *
اكتب متغير يعني.ماذا يفعل المؤشر ل void
يعني في C++؟
المحلول
ومؤشر إلى باطل، ويمكن void*
يشير إلى أي كائن:
int a = 5;
void *p = &a;
double b = 3.14;
p = &b;
ولا يمكنك dereference، زيادة أو إنقاص هذا المؤشر، لأنك لا تعرف ما هو نوع قمت بالإشارة إلى. والفكرة هي أن void*
يمكن أن تستخدم لمهام مثل memcpy
أن مجرد نسخ كتل الذاكرة حولها، ولا يهتمون نوع بأنهم نسخ.
نصائح أخرى
وانها مجرد مؤشر عام، وتستخدم لتمرير البيانات عندما كنت لا تعرف نوع. عليك أن يطرح للنوع الصحيح من أجل استخدامها.
وانها مؤشر الخام إلى بقعة في الذاكرة. أنها لا تسمح لأي الحساب المؤشر مثل شار * أو * كثافة العمليات.
إليك بعض الأمثلة على الاستخدام
وانها مؤشر إلى <م> أي شيء م> - مجرد قطعة من الذاكرة التي يمكن أن تقوم به مع - قد يكون كائن ما، قد يكون حرف. لديك للادلاء أن تفعل شيئا مفيدا معها.
انتباه: جميع عناوين الذاكرة هنا خيالية.أنا فقط أختلقها لتوضيح نقطة ما.
منح:
int data[] = {10,11,12};
لدينا الآن:
0xffff0000-0xffff0003 with a value of (int)(10)
0xffff0004-0xffff0007 with a value of (int)(11)
0xffff0008-0xffff000b with a value of (int)(12)
(أنا لا سندخل في ترتيب البايتات ذات النهاية الكبيرة مقابل الصغيرة هنا.)
اذا كان لدينا:
int * p = data;
لدينا الآن موقع ذاكرة آخر في مكان آخر، على سبيل المثال:
0xaaaa0000-0xaaaa0003 with a value of (int*)0xffff0000
يمكننا ان نستخدم ص[1] [أو *(p + 1)] للإشارة إلى *(int*)(0xffff0004) [=11] كـ sizeof(int)=4 و0xffff0000+sizeof(int) = 0xffff0004.
اذا كان لدينا:
void * v = data;
لدينا الآن موقع ذاكرة آخر في مكان آخر، على سبيل المثال:
0xbbbb0000-0xbbbb0003 with a value of (void*)0xffff0000.
ومع ذلك، لا يحتوي void على أي معلومات sizeof() مرتبطة.لا يمكننا زيادة أو إنقاص المؤشر.لا يمكننا إلغاء الإشارة للوصول إلى البيانات المخزنة في 0xffff0000.يمكننا فقط استخدام القيمة كعنوان ذاكرة أولي.
إذا أردنا استخدام البيانات المخزنة في (void*)0xffff0000، فعلينا أولاً إرسالها إلى النوع المناسب.
ومع ذلك، لا يزال (void*) مفيدًا جدًا كوسيلة لتمرير العناوين إلى هياكل البيانات العشوائية الموجودة حولها.على سبيل المثال، memset().لا يهم ما إذا كنت قد خرجت من الصفر هيكل tm أو أ هيكل sockaddr.نحتاج فقط إلى مؤشر للبنية وحجمها.
(هذا ينبغي أن يكون دون أن يقول، ولكن ...احذر من استخدام memset للتخلص من مثيلات الفئة، وبذلك، ستتم الكتابة فوق جدول المؤشر الافتراضي.)
ومؤشر الفراغ لا يمكن أن يشير إلى عضو فئة في C ++.