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

[ تمت الإجابة ]تغيير قيمه عنصر في مصفوفه عن طريق المؤشر

بدأه صمودا في 15 سبتمبر 2012 · 10 رد · 1,250 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي مثال بسيط ادناه

لقد قمت بتغيير قيمه العنصر الاول للمصفوفه عن طريق المؤشر

كيف يمكنني تغير العتصر الثاني للمصفوفه عن طريق المؤشر نفسه؟

شكر لكم

#include <iostream>
using namespace std;


int main()

{

    int array[3] = {1,2,3};
    int * ptr = array;
    *ptr = 10;
    cout << array[0] << endl;
}
#2

اظنني وجدت الحل لست متاكدا ساحاول ان اكتبه و اي تصحيحات ستكون مفيده من الاخوه:

*ptr[1] = 20;

تم تعديل هذه المشاركة بواسطة صمودا في 15 سبتمبر 2012 في 08:32

#3
صمودا كتب:

اظنني وجدت الحل لست متاكدا ساحاول ان اكتبه و اي تصحيحات ستكون مفيده من الاخوه:

*ptr[1] = 20;

يبدو ان استخدام علامه النجمه يعطيني خطأ

لا اريد الارتباك لان افهم انه عندما نستعمل علامه النجمه Deference Operator نحاول الوصول الى قيمه العنصر او الفريبل التي يوشر اليها المؤشر, يبدو ان هذه الطريقه مع المصفوفه مقبوله فقط للعنصر الاول للمصفوفه الاندكس زيرو

هل يوجد طريقه لتغير عناصر المصفوفه عن طريق المؤشر بدون استخدام Array Indexing ؟ مثلا *ptr+1

#4

السلام عليكم

يمكنك إستخدام الشكل التالى لإعطاء القيم للمصفوفة من خلال المؤشر :

*(ptr)= value ;
*(ptr+1)= value ;
*(ptr+2)= value ;
.
.
.
*(ptr+n-1)= value ;

حيث value هى القيمة المعطاه لعنصر المصفوفة و n هو عدد عناصر المصفوفة .

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 15 سبتمبر 2012 في 10:35

1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#5

السلام عليكم

يُمكنك استخدام المؤثر [] مع المؤشرات, تماماً كما تستخدمه مع المصفوفات, انظر المثال :

#include <iostream>
using namespace std;

int main()
{
    int array[3] = {1,2,3};
    int * ptr = array;
    ptr[1] = 8;
    cout << array[1] << endl;
    return 0;
}

الكتابة *(ptr+1) تُكافئ ptr[1].

أطيب التحية.

2
#6

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

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

	int array[3] = {1,2,3};
	int * ptr = array;

المؤشر ptr يؤشر على متغير من نوع int وليس على مصفوفة تحوي متغيرات من نوع int

كان من الأفضل مثلا أن تستعمل مؤشرا يؤشر على مصفوفة تحوي 3 عناصر int؟؟

هكذا

int array[3]={3,6,9};

int (*ptr)[3]=&array;

ولكن جعلت من مؤشر يؤشر على متغير من نوع int إلى مؤشر يؤشر على جدول يحوي 3 عناصر من نوع int ؟؟؟wacko.gif

كيف هذا؟؟ ألم تسأل نفسك هذا السؤال؟؟

هل تعلم أن المصفوفات هي مؤشرات تابثة تؤشر على أول عناصر لهاcool.gif

int array[5];

==> int *const p=&array[0];

ولما تكتب

int array[3] = {1,2,3};
	int * ptr = array;

فالكومبيلر يفهمها هكذا

int *ptr=&array[0];

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

#include <iostream>
using namespace std;

int main()
{
	int a[5]={3,6,9,12,15};
	cout << *(a+2) << endl;

	return 0;
}

لنرجع لسؤالك

هذا هو التصحيح لخطأك

#include <iostream>
using namespace std;

int main()
{
	int array[3] = {1,2,3};
	int  *ptr = array;
	1[ptr]=8; // == ptr[1]=8; == *(ptr+1)=8; 
	cout << array[1] << endl;
	return 0;
}

و إذا أردت أن تقرأ جميع عناصر المصفوفة استعن بهذا الكود مثلا

#include <iostream>
using namespace std;

int main()
{
	int array[3] = {1,2,3};
	int  *ptr= NULL;
	for(ptr=array;ptr<array+3;ptr++)
	cout << array[ptr-array] << '\t';
	cout << endl;
	return 0;
}

و بالتوفيق

تم تعديل هذه المشاركة بواسطة مومو (momo) في 15 سبتمبر 2012 في 20:41

i love you mama

#7
اقتباس
for(ptr=array;ptr<array+3;ptr++)

هذه الكتابة خطيرة جدا أخي مومو !

من الأفضل دائما استخدام عدد صحيح كعداد للحلقة for لأن التعامل مع العناوين في هذه الحالة قد يُحدث "بلاوي" نحن في غنى عنها :)

#8
أحمد الشنقيطي كتب:

هذه الكتابة خطيرة جدا أخي مومو !

من الأفضل دائما استخدام عدد صحيح كعداد للحلقة for لأن التعامل مع العناوين في هذه الحالة قد يُحدث "بلاوي" نحن في غنى عنها :)

نعم معك حق أخي و أستادي أحمد في اتخاد الحيطة و الحذر في التعامل مع العناوين

ولكن على كل حال الكتابة تبقى صحيحة!!

وأنا رأيت عدة أمثلة منها في عدة مواقع إلكترونية و إليك هذا الرابط مثلا حى تتأكد من صحة كلامي ltam

إلا إذا كان لك رأي آخر أن تفيدنا به

تم تعديل هذه المشاركة بواسطة مومو (momo) في 15 سبتمبر 2012 في 21:34

i love you mama

#9

الكتابة "صحيحة" و لكنها ليسنت "آمنة" لأنه عندما يحدث خطأ في عنوان المؤشر سينعكس ذلك سلباً على دوران الحلقة for و هذا ما جعلني أتجنب دائما استخدام العناوين كعداد للحلقات التكرارية.

#10
ahmedsaoud31 كتب:

السلام عليكم

يمكنك إستخدام الشكل التالى لإعطاء القيم للمصفوفة من خلال المؤشر :

*(ptr)= value ;
*(ptr+1)= value ;
*(ptr+2)= value ;
.
.
.
*(ptr+n-1)= value ;

حيث value هى القيمة المعطاه لعنصر المصفوفة و n هو عدد عناصر المصفوفة .

السلام عليكم اخوتي اسعد الله يومكم ان شاء الله

اشكر كل من الاخوة الذين اجابوني بهذه الاجابات الكافيه شكرا لكم جميعا

الان كل شي مفهوم

مثال الاخ احم سعود واضح كذلك مثال الاخ احمد مع استخدام طريقه المصفوفه ايضا جميل و اسهل للتعامل

بالنسبه للاخ مومو,

صراحه لم اعرف بان المؤشر بجب ان يكون ثابت و يؤشر عل او عنصر لها, رادودني شعور لكن الماده التعليميه التي اتعلم منها لم تذكر هذا سوى (يجب علي ان ارجع المشر الي تاشيره الى العنصر الاول في حاله قمت بعمل مثلا +=2 للموشر الذي يجعله يؤشر على عنصر غير الاول في المصفوفه)

بارك الله فيكم جميعا

#11
صمودا كتب:

بالنسبه للاخ مومو,

صراحه لم اعرف بان المؤشر بجب ان يكون ثابت و يؤشر عل او عنصر لها, رادودني شعور لكن الماده التعليميه التي اتعلم منها لم تذكر هذا سوى (يجب علي ان ارجع المشر الي تاشيره الى العنصر الاول في حاله قمت بعمل مثلا +=2 للموشر الذي يجعله يؤشر على عنصر غير الاول في المصفوفه)

بارك الله فيكم جميعا

ليس هذا ما قصدته أخي صمودا

المؤشر يبقى مؤشر و المصفوفة تبقى مصفوفة في كل جال من الأحوال

ولكن في بعض الحالات(عملية برمجية بين مصفوفة و مؤشر) يلزمنا تحويل المصفوفة إلى مؤشر حتى نقوم بالعمليات البرمجية بشكلها الصحيح

SO/IEC 9899:1999

اقتباس
Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type "array of type" is converted to an expression with type "pointer to type" that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.

حتى تفهم فكرتي بشكل جيد

انظر لهذه الأمثلة

المثال الأول

int a=5,b=6;
int *p=&a,*q=&b;
p=q; // ==>*p=6; true

المثال الثاني

int  a=5;
int  *p=&a;
int  t[2]={0};
t=p; // ==> false  (t se comporte comme un pointeur constant sur son élément initial. t[0])

المثال التالث

int t[2]={5,10};	
int *p=t;

/*  int t[2]  ==> int *const p1=&t[0] */
/*  int *p=t; ==> int *p=p1; */
/*  int *p=&t[0] */

وبالتوفيق

i love you mama

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

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

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

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

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