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

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

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

القاعدة النحوية:
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_Hint 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         // decimal0113       // octal0x4b       // hexadecimal
وكتابة انواعها أيضا:
75         // int75u        // unsigned int75l        // long75ul       // unsigned long
والأرقام العشرية أيضا:
3.14159    // 3.141596.02e23    // 6.02 x 10^231.6e-19    // 1.6 x 10^-193.0        // 3.03.14159L   // long double6.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 1int 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()beginprintf("hello");endint main(){
    t() oo
    int x = 1 oo
    return 0;}

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

لكل متغير مخزن في الذاكرة عنوان يشير إلى مكان توضعه، تكمل فائدة المؤشرات في سرعة التنفيذ ولبناء حاويات ديناميكية يتتغير حجمها أثناء تنفيذ البرنامج، أما بالنسبة للمراجع فتكمن فائدتها عندما تمرر كوسيط عبر الدوال، إذا كنا نريد أن نرسل وسيط ذات حجم كبير مثل المصفوفات ولانريد أن يرسل بقيمته(نسخة جديدة من الوسيط) نقوم باستخدم المراجع، على أية حال المراجع ليست إلا مؤشرات ثابتة:
int var     = 10;     // variableint* varPtr = &var;   // Pointerint& varRef = var;    // Reference <=> const Pointer e.g. ( int* const p) <=> (int& p)