الرئيسيةعريقبحث

المتغيرات في سي++


☰ جدول المحتويات


المتغيرات هي عبارة عن حاويات لها حجم معين (كل نوع له حجم) تخزّن البيانات، تعد من أساسيات البرمجة ولا يمكن لبرنامج أن يعمل من دونها، تتكون من عدة انواع لكل نوع حجم مخصص له في الذاكرة لايمكن أن يتجاوز هذا الحجم، إلا إذا كان يستخدم أنواع ديناميكية تستخدم معها المؤشرات.

المتغيرات الرياضية

هو تمثيل رمزي يدلّ على كمية أو تعبير. بعض الأمثلة تتضمن درجة حرارة الغرفة وارتفاع صوت الكلام. يمثل المتغير عادة باستخدام رمز أو حرف أو كلمة مثل x و y و time.

تعريف المتغيرات البرمجية

القاعدة النحوية:


Type Name = Value;


أنواع المتغيرات

المتغيرات الآلية Auto

المتغيرات الآلية هي نفسها المتغيرات العادية، سميت آلية لتميزها عن الساكنة. يمكن ببساطة تجاهل كتابة كلمة auto لأن المترجم يفهم تلقائيا أن المتغير آلية، تخزن في منطقة Stack المكدس.


auto int f = 10; int g = 20;


المتغيرات الخارجية extern

عندما يكون لديك متغيرين بنفس الاسم والأول متغير محلي والثاني متغير عام، وتريد أن يشتركا في نفس القيمة ماعليك إلا أن تكتب extern عندما تقوم بتعريف المتغير المحلي، تخزن في منطقة Heap.


int r; void pr (void) { extern int r; r = 5; printf("1- %d\n", r); } int main(void) { r = 10; pr(); printf("2- %d\n", r); return 0; }


الآن أصبح المتغيرين المحلي والعام يحملان نفس القيمة وهي 5. أيضا يمكنك تعريف متغير عام في ملف header ثم تضمينه ضمن المشروع ليكون متغير خارجي:


//-----HEADER-----// #ifndef EXTER_H #define EXTER_H int r; #endif // EXTER_H //-----main .cpp-----// #include <stdio.h> #include "exter.h" extern int r; void pr (void) { extern int r; r = 5; printf("1- %d\n", r); } int main(void) { r = 10; pr(); printf("2- %d\n", r); return 0; }


ملاحظة: لايمكنك اسناد قيمة للمتغير عندما تعرفه كتغير خارجي:


extern int r = 20; // Error


المتغيرات الساكنة static

تعد من المتغيرات المحلية، ذلك أن مداها ينتهي عندما تنتهي الدالة، لكن تتميز عن المتغيرات المحلية أنها تبقى مخزنة في الذاكرة حتى نهاية البرنامج، أي يعني تعد هجينة بين المتغيرات المحلية والمتغيرات العامة، فالعامة تبقى مخزنة في البرنامج، وتكون مستعدة لأي استخدام آخر.


void goo() { static int i = 0; i++; if (i >= 10) return; printf("%d\n", i); goo(); } int main(void) { goo(); return 0; }


أنواع البيانات

الثوابت

عندما نتكلم عن الثوابت فكل قيمة عددية أو نصية تعتبر ثابت.


75 // decimal 0113 // octal 0x4b // hexadecimal


وكتابة انواعها أيضا:


75 // int 75u // unsigned int 75l // long 75ul // unsigned long


والأرقام العشرية أيضا:


3.14159 // 3.14159 6.02e23 // 6.02 x 10^23 1.6e-19 // 1.6 x 10^-19 3.0 // 3.0 3.14159L // long double 6.02e23f // float


والثوابت النصية أيضا:


'z' 'p' "Hello world" "How do you do?"


الكلمة المحجوزة const

للثوابت عدة أنواع، النوع الأول يعد نوع عادي شائع الاستخدام:


const float PI = 3.14159;


لايمكن تغير قيمة الثابت إلا عن الطريق الموشرات، ولايمكنك أيضا تعريف ثابت بدون اسناد قيمة له، لذلك ينبغي عليك تعين قيمة الثابت من البداية فقط.

بالنسبة لتغير قيمة الثابت عن طريق المؤشرات، تابع المثال التالي:


const int con = 10; int *ptr = &con; printf("%d\n", con); *ptr = 5; printf("%d\n", con);


القاعدة النحوية الأخرى لـ const، كلا الجملتين صحيحة، وتقوم بنفس العمل.:


const int t = 10;// case 1 int const d = 10;// case 2


المؤشرات الثابتة

في السطر التالي، المؤشر متغير (عنوان الذاكرة) وقيمته ثابتة، أي لايمكن تغير قيمته:


const *int first;


في هذه الحالة، المؤشر ثابت وقيمته متغيرة:


int *const secand;


في الحالة الأخيرة، المؤشر ثابت وقيمته ثابتة، أي لايمكن تغير الاثنين:


const int *const third;


الثوابت الرمزية

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


#define PI 3.14159 #define NEWLINE '\n'


وبالتالي يمكنك التوسع في ذلك حتى في رموز اللغة نفسها:


#include <stdio.h> #define oo ; #define begin { #define end } int t() begin printf("hello"); end int main() { t() oo int x = 1 oo return 0; }


عناوين المتغيرات

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


int var = 10; // variable int* varPtr = &var; // Pointer int& varRef = var; // Reference <=> const Pointer e.g. ( int* const p) <=> (int& p)


مقالات ذات صلة

روابط خارجية

موسوعات ذات صلة :