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

جزء من النص مفقود عن (المؤشرات Pointers)

بدأه ♥ حُوريّة ♥ في 16 يناير 2008 · 9 رد · 3,755 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم.

صباح الخير, انا صاحية نشيطة هذا الصباح لكن نمت وانا جالسة افكر بموضوع "المؤشرات مالها و ما عليها" المثبّت بالمنتدى. و بالطبع عنوان موضوعي "جزء من النص مفقود" قاصدة بالنص هنا هو موضوع "المؤشرات مالها وما عليها". لأني قرأته المغرب البارحة واطلعت على بعض المواضيع الملحقة بالمؤشرات و المثبتة بالمنتدى. لكن لم اجدها تتطرق إلى هذا الموضوع اللي انا حابة اباشر فيه واقدم نبذة عنه. و هو المؤشر الثابت Constant Pointer و المؤشر إلى ثابت Pointer to a constant. أما لو كان هناك موضوع عائم بصفحات المنتدى تطرق إلى هذه الأشياء مسبقاً فبحول الله رح يكون هذا الموضوع معزّز وداعم له و (التكرار يعلّم الشطّار). اوكي, رايحة استغل الساعة هذه واقدم لكم الموضوع,.

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

تمهيد:

أولاً يحظرني في هذا الوقت بالذات اربع مسلّمات (بديهيات) للمؤشرات في لغة C++ وهي كالتالي:

1. عند استخدام المؤشرات فليس هناك إلاّ جوهرتين فقط, هما المؤشر pointer و الكائن object الذي يشير إليه.

2. إذا احتوى المؤشر pointer على قيمة فهي إما عنوان لكائن Object Address في الذاكرة أو لا شيء NULL وهي قيمة صفر, مثل:

MyClass *ptr = 0;//Null Pointer

فهذا يسمى مؤشر إلى "لا شيء" NULL Pointer.

3. حجم و مساحة مؤشر لكائن ضخم مثل (الجبل) هو نفس حجم و مساحة مؤشر لكائن زغير مثل (العصفور). هذا يعني بكل بساطة مساحة (الحجم الفعلي في الذاكرة) المؤشرات دائماً متساوية لأنها لا تحمل إلا عناوين ثابتة في الذاكرة لها نفس الحجم نسبةً إلى نظام عنونة الذاكرة من جهاز إلى جهاز آخر أو من بيئة إلى أخرى. لاحظوا الشيفرة التالية لترسيخ هذي المعلومة:

int *ptrInt = new int(10);//Pointer to int data type
double *ptrDouble = new double(30.523);//pointer to double data type.

//Print the size of both ptrInt and ptrDouble:
cout << "ptrInt size is: " << sizeof(ptrInt) << " byte(s)" << endl;
cout << "ptrDouble size is: " << sizeof(ptrDouble) << " byte(s)" << endl;

لاحظوا ناتج البرنامج:

CONSOLE
ptrInt size is: 4 byte(s)

ptrDouble size is: 4 byte(s)

بالطبع اربعة Byte حجم مؤشر لنوع int وَ حجم مؤشر لنوع double نسبة إلى نظام عنونة الذاكرة في جهازي 32-bit. سامحوني بالنسبة للمثال استخدمت الأمر new مباشرة لكائن int و double لمحاكاة الطريقة النموذجية من إنشاء المؤشرات في امور متقدمة, بالإضافة إلى اهمالي لأوامر تحرير الذاكرة وذلك لعدم إزحام الشيفرة وتشتيت اذهان القراء كثيراً.

4. المسلّمة الرابعة, هي أن المؤشر لا يشير إلا لكائنات من نفس النوع (مثلاً, مؤشر لعدد صحيح لا يشير إلا لكائن عدد صحيح...الخ) , الشيفرة التالية خطأ:

int *ptrInt = new double(23.0);//Fatal error…Because there is no way to convert from double to int

حتى الشيفرة التالية خطأ بالرغم من إمكانية التحويل الضمني implied promotion من int إلى double

double *ptrDouble = new int(24);//Fatal error...for the same reason too.

صُلب الموضوع:

سنتعرف هنا على ثلاث انواع تقريباً من المؤشرات و التي لها بريق لامع في برامج متقدمة. النوع الأول و هو مؤشر ثابت constant pointer يختلف تماماً بل ضد النوع الثاني مؤشر لــثابت pointer to a constant و ثم النوع الثالث و الذي هو عبارة عن هجين hybrid(متجانس) من النوعين السابقين. نبدأ صلب الموضوع باسم الله:

مؤشر ثابت constant pointer:

الهيكل النحوي لهذا النوع كالتالي:

LEFT TO RIGHT
type * const ptrName = &obj;

عند التعامل مع هذا النوع فإنه يجب علينا إعتبار النقاط التالية:

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

- يجب أن يكون الكائن المُشار إليه بهذا النوع من المؤشرات متغيراً (أي ليس ثابت منشيء بواسطة الكلمة const).

الخلاصة: يمكننا تغير قيمة الكائن المُشار إليه بهذا النوع من المؤشرات مع عدم إمكانيتنا من جعله يشير إلى كائن آخر.

تلميح: لتذكر اسم هذا النوع من المؤشر اقرأوه من اليمين لليسار من النموذج السابق (انظر عند اسم المؤشر ثم انتقل إلى جهة اليمين لأرى كلمة constant ثم إشارة النجمة الخاصة بالمؤشر pointer فنتهجاها بــ Constant Pointer. التالي عبارة عن سطور لشيفرة تصف استخدامات هذا النوع بشكل مبسط:

int obj1, obj2 = 0;
int * const ptr = &obj1;
*ptr = 10;//Ok, change the value to which it point to.
cout << obj1 << ' ' << (*ptr) << endl;
//ptr = &obj2; Error, It can't point to anothor object 
*ptr = 30;//Ok, change the value again...

الإستعمال الجوهري لهذا النوع: هو استخدامه لتمرير كائن object إلى إجراء function بحيث نحافظ على ثبات المؤشر داخل الاجراء ليشير فقط إلى ذلك الكائن مع إمكانية تغيير قيمة ذلك الكائن. تتبعوا المثال التالي:

//Authord by Raghad to illustrate constant pointer.
#include <iostream>
using std::cout;
using std::endl;

void func(int * const);
int main()
{
	int obj;
	obj = 4000;
	func(&obj);//Passing the address of obj to func()…acts as initialization

	cout << obj << endl;// It's 40
	return 0;
}
void func(int * const ptr)
{
	int someVar = 40;
	// ptr = &someVar; Error, we can't change the address(obj).
	*ptr = someVar; //Ok, just change the value of (obj) itself.

}

مؤشر لــثابت Pointer to a constant:

الهيكل النحوي لهذا النوع كالتالي:

LEFT TO RIGHT
const type * ptrName;

هذا النوع تقريباً ضد او معاكس النوع السابق constant pointer. رايحة اسرد خصائصه على شكل نقاط كالتالي:

- لا يجب تعيين كائن object كعنوان استهلالي لهذا المؤشر, و هذا يعني أن المؤشر يمكن استخدامه للإشارة إلى كائنات أخرى طوال فترة حياة البرنامج Program Life-Cycle.

- لا يمكن تغير قيمة او محتوى الكائن الذي نُشير إليه بواسطة هذا النوع من المؤشرات, و بالتالي فهو مناسب للإشارة إلى متغير عادي او إلى ثابت (ناشيء بواسطة الامر const).

الخلاصة: يمكن بواسطة هذا النوع الإشارة إلى اكثر من كائن طوال فترة تنفيذ البرنامج و يمكن أن تكون هذه الكائنات متغيرات او ثوابت. أما الذي لا يمكننا عمله بواسطة هذا النوع هو تغير قيمة ذلك الكائن الذي يشير إليه.

تلميح: لتذكر اسم هذا النوع نقرأ ايضاً من اليمين إلى اليسار من النموذج للهيكل النحوي بالأعلى ابتداء من اسم المؤشر نجد علامة النجمة و تُقرأ pointer مؤشر إلى(to) ثابت const.

السطور التالية توضح بعض الاستعمالات و القيود restrictions لهذا النوع:

int obj1, obj2;
const int NORMAL_CONST = 23;
obj1 = obj2 = 0;
const int *ptr;//Pointer to a constant.
//Usage:
ptr = &NORMAL_CONST;//It can point to constant
cout << (*ptr) << endl;
ptr = &obj1;//Ok, It’s allowed to change pointing to another object.
// *ptr = 30; Error, we can't use it to change the values directly.
ptr = &obj2;//Ok

الإستعمال الجوهري لهذا النوع: هو استخدامه لتمرير كائن object متغير أو ثابت إلى إجراء function بحيث نزيد من مرونة المؤشر بالسماح له بالإشارة إلى كائنات objects عديدة داخل الإجراء مع الحفاظ على ثبات القيم لهذه الكائنات وعدم المساس بها أثناء التنقل من كائن إلى آخر.

مؤشر ثابت إلى ثابت Constant Pointer to a Constant:

الهيكل النحوي لهذا النوع كالتالي:

LEFT TO RIGHT
const type * const ptrName = &obj;

هذا النوع هو النوع الهجين(المتجانس) من النوعين السابقة. فهناك بعض العوامل المشتركة بينه وبين النوع الاول constant pointer و الآخر pointer to a constant و هي كالتالي:

يشترك مع المؤشر الثابت constant pointer في التالي:

- يجب تعيين الكائن لهذا المؤشر كعنوان استهلالي عند إنشائه. هذا يعني أن هذا المؤشر لن يشير إلاّ لهذا الكائن فقط لا غير طوال دورة حياة البرنامج Program life-cycle.

يشترك مع المؤشر لــثابت pointer to a constant في التالي:

- يمكنه الإشارة إلى كل من كائن object متغير non-constnat و إلى ثابت constnat ايضاً.

- بالإضافة إلى ذلك فإننا لا يمكننا تغير قيم الكائنات التي يشير إليها إطلاقاً.

تلميح: تتبعوا القراءة بنفس الطرق الأولى من اليمين إلى اليسار ابتداء من اسم المؤشر من الهيكل النحوي بالأعلى. Constant والنجمة pointer إلى(to) constant.

نلعب مع هذا النوع من خلال السطور التالية: اوووبز؟؟؟ باين عليه ما يبغى يلعب معانا (ثقيل دم) غير مرن ما يبغى يشير إلى كائن آخر و لا يبغى يغير قيمة هذا الكائن. أوكي رايحة اسميه المؤشر الوفيّ The Loyal Pointer :

int uglyObj = 20;
const int * const ptr = &uglyObj;//ptr points to uglyObj for ever just because it is the first love(initialized).
cout << (*ptr) << endl;
// *ptr = 30;Error, no way to change its mind(the value to which it points).
int beautifulObj = 30;//New beautiful object.
//ptr = &beautifulObj;Error, no way to capture its heart (to point to something else)

الاستعمالات الجوهرية: ايضاً مثل السابقات و لكن للإشارة إلى كائن ضخم للقراءة فقط.

تنويه: بالطبع الكلام حول المؤشرات و تمرير البيانات إلى الإجراءات ما يخلص في لغة C++ و هذا إن دل! دل على قوة هذه اللغة وامتداد تراكيبها النحوية و التقنية. و بالنهاية راجية من الله عز و جل اكون وصلّت فكرة هذي النوعين أو بالأحرى الثلاث انواع من المؤشرات.

تمنياتي لكم بالتوفيق

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#2

السلام عليكم ,,

جميل جداً أخت رغد, الحقيقة لدي ثلاث نقاط متعلقة بالدرس,

الأولى

ماذا يعني الثابت NULL في ++C, أعرف أنه صفر و لكن صفر من اي نوع!

الثانية ,,

بالنسبة للنوع الأول المذكور, ألا يمكن بدلاً من ذلك استخدام الطريقة التالية :

void func( int* ) const;

بحيث يتم منع تغيير أي شيء خلال عمل الدالة!

الثالثة ,,

ما هي الفرق أو لنقل مميزات استخدام النوع الثالث أو استخدام المتغيرات المرجعية بدلاً من ذلك!

أتمنى أن تقومي بإضافة الدرس إلى قائمة دروسك في مواضيع الأعضاء الـ VIP لأنه درس و مرجع مهم حقيقة B)

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 16 يناير 2008 في 18:56

#3

ما شاء الله موضوع رائع و كما إعتدنا منك مواضيعك واضحة و مفصلة و مباشرة و مدعمة بالتطبيق.

بارك الله فيكى يا أخت رغد.

#4

شكراً أخ Blueteeth , المنتدى ايضاً يشجع على التميز بسبب وجود من يمتاز بالتميّز امثالكم. فأنا ساعية في تقديم الشيء المقبول على الاقل إن شاء الله

----------------------------

شكراً خالد لتقييمك. المهم إعانة الله لي في إجابة اسئلتك ابتدأ من السؤال الأول: بسم الله

اقتباس
الأولى

ماذا يعني الثابت NULL في ++C, أعرف أنه صفر و لكن صفر من اي نوع!

أولا كلمة NULL كلمة على مستوى علوم الكمبيوتر ومستوى لغات البرمجة ليست حِكراً على ++C فقط. هذه الكلمة تستعمل تقنياً للإشارة على قطعة البيانات الغير معرّفة بعد. وهي غالباً ما تعني "لا شيء" NOTHING. بالنسبة للغة ++C فهي عبارة عن ماكرو Macro تقريباً معرف كالتالي:

#define NULL 0

لأنواع البيانات العددية مثل int و double فهي تعني قيمة صفر. أما للبيانات النصية فهي تعني empty string سلسلة حرفية فارغة "", أما للكائنات و تحديداً مثل المؤشرات لكائنات فهي "لاشيء" أو لا كائن ان صح التعبير Uknown object. بالنسبة لنا نستطيع كتابة التالي بالنسبة للمؤشرات في لغة ++C:

SomeClass *ptr = NULL;

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

ملاحظة: محاولة الوصول إلى بيانات accessing data عن طريق مؤشر يشير إلى لا شي NULL Pointer فهو خطأ قاتل يمنع تصريف البرنامج.

---------------------------

الإجابة الثانية بخصوص تعويض النوع الأول بالسطر التالي:

void func( int* ) const;

أولا هذي التقنية متعلقة فقط بتقنية البرمجة الكائنية Object-Oriented Use Only. لا نستطيع استخدامها بتقنية البرمجة الإجرائية العادية Traditional Procedural Programming. هذا اول ميزة في الموضوع. الشطر الثاني من الإجابة تتجسد في عبارتك التالية اللي انت كتبتها يا خالد:

اقتباس
بحيث يتم منع تغيير أي شيء خلال عمل الدالة!

وأنت تقصد و تعني كلمة "أي شيء", لكن من النوع الأول فقط نمنع تغير ذلك الكائن الممرر عن طريقه فقط. ثم طريقتك هذي معروفة و مقتصرة عند الخبراء في ما يُعرف بـ Getting Property تلك الإجراءات التي نقرأ بواسطتها حالة كائن ما Object Status.

الإجابة الثالثة:

اقتباس
الثالثة ,,

ما هي الفرق أو لنقل مميزات استخدام النوع الثالث أو استخدام المتغيرات المرجعية بدلاً من ذلك!

انا متوقعة انت تقصد التالي بالمتغيرات المرجعية الثابتة طبعاً مثل التالي:

(const int &)...

ايضاً ممكن يستخدم كبديل للنوع الثاني من المؤشرات الموجودة بالدرس الاصلي هنا وليس فقط النوع الثالث. ولكن الفرق بيناتهن يتجسد بالضبط في الفرق الاصلي والاساسي بين المؤشر و المرجع: ويتلخص كالتالي:

- نستخدم المؤشرات للإشارة إلى مؤشر آخر. بالمقارنة مع المراجع ما نقدر نعمل الشي هذا بين مرجع وآخر

- في مواضيع متقدمة مثل Bit-fields و هي متعلقة بالهياكل structure الناشئة بواسطة struct فإننا لا نستطيع استعمال المراجع معها.

- لا نستطيع عمل مصفوفة من المراجع. بالمقارنة مع المؤشرات فإننا نستطيع ذلك.

اتوقع هناك فروق اخرى ولكن لا تحظرني الآن. وعلى العموم انا شايفة انت عملت تقصي للنوع الثالث, لكن مهما كان نخلي ببالنا ان هناك فروق بين المؤشرات و المراجع حتى لو شفنا هناك تشابه جزيء عند تمرير قيمة معينة او ما إلى ذلك.

تمنياتي لكم بالتوفيق

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#5

السلام عليكم,

أسئأذنك أخت رغد إنى أوضح بعض النقاط:

- الماكرو >

 #define NULL 0

صحيح 100% هو فعلا متعرف كدة لذلك مفيش "تقريبا" :) لكن عايز أوضح حاجة, هذا الأسلوب هو المتبع لتعريف الثوابت(constants) فى ال C, لذلك تسميته "ماكرو" بدلا من "ثابت", نوعا ما, لا يساعد على فهم الغرض منه. فعندما يقوم ال preprocessor بعملية الترجمة, يستبدل كلمة NULL كل مرة يجدها بالحرف "0", ثم يأتى الكومبايلر و يأخذ النص الناتج و يعمل له ترجمة. و بالتالى إذا كتبنا 0 أو NULL فالموضوع سيان تماما.

- كفرق جوهرى بين المؤشر و المرجع, أن المؤشر هو نوع بيانات data type و نعامله كمتغير عادى, بينما المرجع هو "طريقة" لتبادل المتغيرات بين الإجراءات و بعضها. لذلك لا معنى لكلامنا عن المرجع داخل جسم الإجراء و لكن فقط نذكره عندما نستدعى الإجراء أو نخرج منه.

والله أعلم.

#6

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

----------

أما بالنسبة لـ NULL هي مثل 0 في استهلالية المؤشرات صراحة انت على حق "تقريباً" هنا انا اعني كلمة تقريباً ماني مستعجلة :) شو رياك نخلي العالِم البرفسر Bjaren Stroustrup يفصل بيني وبينك بالموضوع هذا

شوف كلامه نصياً وانا رايحة اترجم بعده مباشرة

LEFT TO RIGHT
In C++, the definition of NULL is 0, so there is only an aesthetic difference. I prefer to avoid macros, so I use 0. Another problem with NULL is that people sometimes mistakenly believe that it is different from 0 and/or not an integer. In pre-standard code, NULL was/is sometimes defined to something unsuitable and therefore had/has to be avoided. That's less common these days.

If you have to name the null pointer, call it nullptr; that's what it's going to be called in C++0x. Then, "nullptr" will be a keyword.

اقتباس
في لغة سي++ تعريف كلمة NULL هو قيمة صفر, ولكن هناك فرق جمالي فقط بينهم. أنا افضل تجنب الماكروز لذلك انا استعمل القيمة 0 . المشكلة الأخرى حول الكلمة NULL هي أن الناس بعض الأحيان يؤمنون أو يعتقدون بالخطأ أنها تختلف عن قيمة صفر و أو أنها ليست عدد صحيح. في الشيفرات التي كانت قبل تعميم و توحيد اللغة كانت و حتى الآن بعض الأحان تُعرّف بطريقة غير مناسبة وملائمة ولهذا السبب يجب علينا تجنبها "أي تجنب استعمال كلمة الماكرو NULL" .

إذا كان يجب علينا تسمية مؤشرات من نوع NULL إذاً نسميها nullptr. وهذا الذي سيكون في نسخة لغة ++C القادمة وهي ++C0x. ثم أن كلمة nullptr ستصبح من الكلمات المحجوزة او مفتاح كلمة إن صح التعبير keyword في المستقبل.

طبعاً المقصود بـ NULL هنا الماكرو الذي يتضمن عن طريق المكتبة العامة. أما لو كنا نحنا اللي انشأناه وواثقين فيه فلا بأس و رح يكون ما في فرق بيه وبين القيمة صفر.

شوف البرفسر شو بيفضل يا أخ Blueteeth ونعمل مثله إن شاء الله. طبعاً يفضل الطريقة التي اشرت إليها سابقاً بالدرس وهي تعين قيمة صفر كالتالي:

LEFT TO RIGHT
type *nullptrP=0;
.

إلى حين إشعار آخر...

بالنهاية شاكرة مرورك أخي Bluteeth و شاكرة توضيحاتك حول المرجع و المؤشر.

بإمكانكم مشاهدة المقال من الموقع الرسمي للبرفسر Just Press Me

تمنياتي بالتوفيق لكم جميعاً

تم تعديل هذه المشاركة بواسطة رغـــــــــد في 17 يناير 2008 في 20:49

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#7

شكرا للتوضيح أخت رغد, و شكرا على الموقع "الرائع"!

#8

السلام عليكم ,,

عذراً على التأخير في الرد يا أخوان :(

المهم أني كنت أنوي التعمق قليلاً في موضوعك لأنه ليس بالهين حقيقة,

حسناً نبدأ بـ NULL, الأخت رغد و الأخ Blueteeth ,, مشكورين على المعلومات القيمة,

عندما قرأت كلام Bjarne Stroustrup, هو في الحقيقة يفضل استخدام 0 بدلاً من NULL و حقيقة أنا أفضل استخدام NULL لأني باستخدامها افرق بين المؤشرات و الأعداد الصحيحة,

و لكني اكتشفت أنها ليست دائماً معرفة على الشكل التالي :

 #define NULL 0

رغم أن معظم مترجمات ++C تعرفها كما في الأعلى, إلا أنني عند بدايتي في تعلم ++C وجدتها معرفة في بعض المترجمات الغير المشهورة كالتالي :

#define NULL (void*)0

لهذا السبب اختلط الأمر علي قليلاً, و شكراً على التوضيح يا أخوة,

بالنسبة للسؤال الثاني والثالث فقد وفت و كفت الأخت رغد,

و اعذروني على اللخبطة التي حصلت :wacko: لأني صار لي شهر بدون مترجم :lol: و عندي كمبيوترين عطلوا سوا :( و على الله نصلحهم عن قريب,,

تحياتي ,,

#9

السلام عليكم

-------

مرحبا يا أخ خالد...

---

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

---------

تمنياتي لكم بالتوفيق

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#10

السلام عليكم

اخواني أعجبني الشرح كثيرا

ومشكورين كتير عالمجهود

ولكن لدي سؤال

هو ما الفرق بين وضع كلمة const قبل النجمة أو بعدها

مثل

  1.  
  2. char const*a="Mohammad";
  3. char *const b="Mohammad";
  4.  

دولة الخلافة الاسلامية في المخاض الاخير وميلادها قريب

حزب التحرير : التزم الطريق الصحيح الشرعي الوحيد لاعادة دولة الخلافة الاسلامية .

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

الامة الاسلامية تحتاج لاحداث تسحقها سحقا وتمعسها معسا لتفكر تفكيرا جماعيا بالتغير لان وحدة المشاعر لوحدها لاتكفي وهذة الاحداث كلها خير

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