سؤال

أنا أقرأ بعض التعليمات البرمجية في Ogre3D التنفيذ ولا أستطيع أن أفهم ما void * اكتب متغير يعني.ماذا يفعل المؤشر ل void يعني في C++؟

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

المحلول

ومؤشر إلى باطل، ويمكن void* يشير إلى أي كائن:

int a = 5;
void *p = &a;

double b = 3.14;
p = &b;

ولا يمكنك dereference، زيادة أو إنقاص هذا المؤشر، لأنك لا تعرف ما هو نوع قمت بالإشارة إلى. والفكرة هي أن void* يمكن أن تستخدم لمهام مثل memcpy أن مجرد نسخ كتل الذاكرة حولها، ولا يهتمون نوع بأنهم نسخ.

نصائح أخرى

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

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

إليك بعض الأمثلة على الاستخدام

http://theory.uwinnipeg.ca/programming/node87.html

وانها مؤشر إلى <م> أي شيء - مجرد قطعة من الذاكرة التي يمكن أن تقوم به مع - قد يكون كائن ما، قد يكون حرف. لديك للادلاء أن تفعل شيئا مفيدا معها.

بناءا على مشاركتي السابقة...


انتباه: جميع عناوين الذاكرة هنا خيالية.أنا فقط أختلقها لتوضيح نقطة ما.


منح:

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 ++.

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