سؤال

أقول لدينا التعليمة البرمجية التالية:

int main(){
    int a[3]={1,2,3};
    printf("      E: 0x%x\n", a);
    printf("  &E[2]: 0x%x\n", &a[2]);
    printf("&E[2]-E: 0x%x\n", &a[2] - a);
    return 1;
}

عند تجميع وتشغيل النتائج على النحو التالي:

      E: 0xbf8231f8
  &E[2]: 0xbf823200
&E[2]-E: 0x2

أنا أفهم نتيجة &E[2] والذي هو 8 بالإضافة إلى مجموعة عنوان منذ فهرستها من قبل 2 من نوع int (4 بايت على نظام 32 بت), ولكن أنا لا يمكن معرفة السبب في السطر الأخير هو 2 بدلا من 8?

وبالإضافة إلى ذلك, ما هو نوع من السطر الأخير يجب أن يكون عدد صحيح أو عدد صحيح المؤشر ؟

أنا أتساءل إذا كان هذا هو نوع C نظام (كيندا الصب) التي تجعل من هذه شاءت?

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

المحلول

عليك أن تتذكر ماذا التعبير a[2] يعني حقا.هو بالضبط ما يعادل *(a+2).لدرجة أنه هو قانوني تماما لكتابة 2[a] بدلا من ذلك, مع تأثير مطابق.

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

نفس المنطق ينطبق على مؤشر الخلافات ، وهو ما يفسر النتيجة من 2.

تحت غطاء محرك السيارة ، في سبيل المثال المؤشر مضروبا sizeof(int) للحصول على إزاحة البايت التي يتم إضافتها إلى قاعدة عنوان المصفوفة.لقد فضح هذا التفصيل في يطبع اثنين من عناوين.

نصائح أخرى

عندما طرح المؤشرات من نفس النوع والنتيجة هي عدد العناصر و ليس عدد وحدات البايت.هذا هو حسب التصميم بحيث يمكنك بسهولة مؤشر صفائف من أي نوع.إذا كنت تريد عدد وحدات البايت - يلقي عناوين شار*.

عند زيادة المؤشر من 1 (p+1) ثم مؤشر من شأنه أن يشير إلى التالي صالحة العنوان بإضافة ( p + sizeof(نوع)) بايت p.(إذا كان نوع int ثم p+sizeof(int))

نفس المنطق يحمل جيد بالنسبة p-1 أيضا ( بالطبع طرح في هذه الحالة).

إذا كنت مجرد تطبيق تلك المبادئ هنا:

بعبارات بسيطة:

a[2] can be represented as (a+2)
a[2]-a      ==>  (a+2) - (a)    ==> 2

لذا وراء المشهد ،

a[2] - a[0]  
==> {(a+ (2* sizeof(int)) ) - (a+0) }  / sizeof(int) 
==> 2 * sizeof(int) / sizeof(int) ==> 2

خط &E[2]-2 تقوم مؤشر الطرح ليس صحيحا الطرح.مؤشر الطرح (عند كل المؤشرات تشير إلى البيانات من نفس النوع) إرجاع الفرق من عناوين في مقسوما على حجم ونوع أنها نقطة.قيمة الإرجاع هي int.

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

كنت قد تكون مهتمة في مؤشر الحسابية في C السؤال والأجوبة.

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

عند إضافة وطرح المؤشرات في ج ، يمكنك استخدام حجم نوع البيانات بدلا من عناوين المطلقة.

إذا كان لديك مؤشر كثافة وإضافة عدد 2 ، وسوف تقدم 2 * sizeof(int).في نفس الطريقة, إذا كنت طرح اثنين من مؤشرات كثافة ، سوف تحصل على نتيجة في وحدات sizeof(int) بدلا من الفرق المطلق عناوين.

(وجود مؤشرات باستخدام حجم نوع البيانات مريحة جدا, بحيث يمكنك على سبيل المثال يمكن ببساطة استخدام p++ بدلا من الاضطرار إلى تحديد حجم ونوع كل مرة: p+=sizeof(int).)

Re:"في الإضافة ، ما هو نوع من السطر الأخير ينبغي أن يكون ؟ عدد صحيح أو مؤشر صحيح??"

عدد صحيح/عدد.وعلى نفس المنوال أن:اليوم - نيسان / 1 = عدد.لا تاريخ

إذا كنت تريد أن ترى بايت الفرق ، عليك أن النوع الذي هو 1 بايت في الحجم, مثل هذا:

printf("&E[2]-E:\t0x%x\n",(char*)(&a[2])-(char*)(&a[0]))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top