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

ما الفرق بين البادئة * و &

مغلق
بدأه EngWaleed في 4 مايو 2006 · 3 رد · 490 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أتمنى إعطائي بعض المعلومات عن الفرق بين البادئة * و البادئة &

يعني ما الفرق بين

*n;

و

&n;

إذا فرضنا إن المتغير بكلا الحالتين من النوع int

فما الفرق بينهما ؟؟؟

أنا كتبت الكود التالي:

#include <stdio.h>

void main() {
int *adrs;
printf("enter the address\t", adrs);
scanf("%x", &adrs);
printf("Address:%x\tValue:%x", adrs, *adrs);
}

طبعا المثال السابق اشتغل من أحسن مايكون

لكن اللي ماني عارفه هو فائدة الـ & قبل المتغير adrs في جملة الـ scanf

????

#2

السلام عليكم

لو كان عندنا مثلا مؤشر كالتالي

int *ptr = new int(5);

فيمكن عمل dereference للمؤشر و المقصود بها التعامل مع القيمة التي يشير لها و التي جعلناها 5 في المثال السابق بإستخدام

*ptr

فمثلا يمكن إسنادها ل 10 بدلا من 5 كالتالي

*ptr = 10;

أي أن * و يطلق عليه dereference operator يجعلك تتعامل مع القيمة التي يشير لها المؤشر و ليس مع المؤشر نفسه

أما & فيستخدم للحصول على موقع يشير إلى كائن في الذاكرة

فمثلا لو كان عندنا التالي

int a = 2, b = 7;

و كان هناك دالة إسمها swap تقوم بأخد مؤشرين لعددين و تبديلهم و كان الprotype لها كالتالي

void swap(int *x, int *y);

فيمكن أن نبعث لها مؤشرين إلى a و إلى b بإستخدام & كالتالي

swap ( &a, &b);

و هناك ما يسمى pointer to pointer أي مؤشر إلى مؤشر و لكنه لا يشير إلى نوع عادي ك int مثلا بل يشير إلى مؤشر

فمثلا يمكننا تعريف مؤشر يشير إلى int* كالتالي

int **ptr;

و يعامل كالمؤشرات العادية عامله على أنه يحتوي على قيمة عادية و لكن هذه القيمة هي قيمة مؤشر أخر

و يمكنك الحصول على قيمة المؤشر الأخر في هذه الحالة كالتالي

*ptr

أما إذا أردت القيمة التي يحتويها هذا المؤشر الأخر فيمكنك كتابة التالي

**ptr

أنصحك بإستخدام خاصية البحث بصورة أكبر فالمنتدى مليء بالمواضيع التي تتحدث عن المؤشرات

#3

اذا كان المتغير int number مثلا.. قإن

number هو قيمة النتغير

number& تعطيك عنوان هذا المتغير في الذاكرة.

و number* في هذه الحالة لا معنى لها..

scanf("%x", &adrs);

الدالة scanf تأخذ مؤشر الى المتغير الذي تريد التمرير فيه..

>> السبب ،لأنها ستغير قيمة هذا المتغير فلا تريد منك ارسال متغير عادي فتصنع منه نسخة وتغير النسخة وتعود أنت الى متغيرك لتجده كما كان ولم يتم التعويض فيه.. لهذا تطلب الدالة ان تمرر لها مؤشر وليس المتغير نفسه<<

.(الذي بين >>.... << هو رأيي واعتقادي :) )

أسامة لم انتبه الى ردك - كنت اكتب ردي...لهذا لم أشر اليه في ردي.

تم تعديل هذه المشاركة بواسطة إسماعيل ابراهيم في 4 مايو 2006 في 22:38

#4

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

شكرا لكل من رد وحاول مساعدتي

والصراحة كان الشرح أكثر من رائع

ووصلت الفكرة وفُهِم الدرس

n //the variable itself.
*n //points to a specific cell in memory having the address [vlaue of n].
&n //the address of the variable.

هذا الموضوع مغلق.

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