الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]الفرق بين Swap للمتغيرات و Swap للمؤشرات

بدأه Thewhite Flower في 5 ديسمبر 2012 · 9 رد · 1,076 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

تحية طيبة للجميع

احتاج مساعدتكم في حل المسألة المرفقة في الموضوع

لغة البرمجة المستخدمة c++

وجزاكم الله خيرا

Q.doc

#2

يُمنع حل الواجبات المنزلية.

أين محاولتك للسؤال ؟

#3

شكرا أخي Sn@CkeR على الرد السريع

أنا فاهمة أن الدالة swap تقوم بالتبديل بين قيمتي المؤشرين a و b

ولكن لم أفهم معنى النجمتين عند استقبال المؤشرين في الدالة الأولى في السطر الأول

وفي السطر الثاني لماذا استخدم مؤشر temp بدلا من استخدام متغير عادي temp

مرفق محاولتي البسيطة في حل المسألة

وأرجو منكم مساعدتي في حلها

وجزاكم الله خيرا

تم تعديل هذه المشاركة بواسطة Thewhite Flower في 6 ديسمبر 2012 في 12:41

#4

أحسنتِ ! محاولة جيدة :)

باختصار : الدالة الأولى تستقبل مؤشرين و تُبادل بين عناوينهما أما الدالة الثانية فتستقبل متغيرين و تُبادل بين قيمهما.

اقتباس
لم أفهم معنى النجمتين عند استقبال المؤشرين في الدالة الأولى

النجمتين تعني مؤشر لمؤشر (Pointer to Pointer).

اقتباس
في السطر الثاني لماذا استخدم مؤشر temp بدلا من استخدام متغير عادي temp

لأن عملية التبديل ستحدث بين مؤشرين و بالتالي يجب أن يكون المتغير المؤقت مؤشر أيضا.

2
#5

شكرا استاذ Sn@CkeR على تجاوبك معي جزاك الله خيرا

لكن هناك نقطة لم افهمها وهي كيف يتم التحويل بين عنواني المؤشرين a و b في الدالة الأولى

مرفق مثال على الدالة الثانية فهل هي صحيحة؟

تم تعديل هذه المشاركة بواسطة Thewhite Flower في 6 ديسمبر 2012 في 13:44

#6

سبب الخطأ هو أنك تتعاملين مع الــ Pointer to Pointer على أنه متغير عادي و هذا غير صحيح لأن المؤشر لمؤشر يحتوي على عنوان يُشير إلى قيمة :)

اقتباس
هناك نقطة لم افهمها وهي كيف يتم التحويل بين عنواني المؤشرين a و b في الدالة الأولى

المتغير temp تأتي فائدته في تخزين عنوان المؤشر المعني.

عند تنفيذ هذه الخطوة :

int *temp =*a

سيصبح المؤشر temp يحمل عنوان a. و هذا الأمر :

*a = *b

يعني إسناد عنوان b إلى a. و الأمر التالي :

*b = temp

يعني إسناد عنوان temp إلى b (عنوان temp هو نفسه عنوان a).

2
#7

شكرا استاذ Sn@CkeR

لكن ماهي القيم الصحيحة التي اضعها في المربعات في المثال على الدالة الأولى؟ وماهي القيم التي تستقبلها الدالة؟

هل هي نفسها في المثال على الدالة الثانية؟

اعطيني مثال على الدالة الأولى

#8
اقتباس
ماهي القيم الصحيحة التي اضعها في المربعات في المثال على الدالة الأولى ؟

ليست قيم و إنما عناوين متغيرات.

اقتباس
اعطيني مثال على الدالة الأولى

تفضلي :

#include<stdio.h>

void swap(int ** a, int ** b) {
    int *temp = *a;
    *a = *b;
    *b = temp;
}

int main() {

    int n = -1, m = 3, *x = &n, *y = &m;

    printf("BEFORE : \n");
    printf("x : %p -> %d \n", x, *x);
    printf("y : %p -> %d \n", y, *y);

    swap(&x, &y);

    printf("\nAFTER : \n");
    printf("x : %p -> %d \n", x, *x);
    printf("y : %p -> %d \n", y, *y);

    return 0;
}
1
#9

جزاك الله خير استاذ Sn@CkeR ماقصرت

كفيت ووفيت

جعلها الله في موازين حسناتك

كيف ارسلك النقاط ؟

#10
اقتباس
كيف ارسلك النقاط ؟

قومي بترشيح الإجابات التي أفادتك و سيتولى نظام التقييم مسألة توزيع النقاط.

بالتوفيق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…