http://up9.iranblog.com/images/fknb8ukl3i2c4bo8jwhj.gif

آپلود عکس و فایل ایران بلاگ

+ پاسخ گويي به اين گفتگو
صفحه 2 از 2 اولاول 1 2
نمايش نتايج 11 به 14 از 14

نام گفتگو: برنامه نویسی c در سیستم عامل gnu

  1. #11
    آواتار ELVIS

    تاريخ عضويت : Nov 2008
    شهر : TEHRAN
    پست ها : 11,754
    سپاس
    3,857
    تشکر شده 4,824 بار در 2,287 پست

    پيش گزيده نقل قول : برنامه نویسی c در سیستم عامل gnu

    3.4 توضیح سریع تابع ()printf
    شما احتمالا متوجه عبارت دو حرفی n\ در مواقعی که از تابع ()printf ‌ استفاده می کنیم شده‌اید. این عبارت در خروجی چاپ نمی‌شود بلکه ()printf ‌ را متوجه می کند که باید به سطر بعد برود. به طور کلی اسلاش وارونه (\) کاراکتر گریز (escape character) زبان سی محسوب می شود و هرگاه در داخل 2 کوتیشن مارک قرار گیرد کاراکتر بعد از آن معنای مخصوصی را خواهد داد.نمونه دیگر t\ است که به اندازه یک tab فاصله خالی در خروجی ایجاد می کند. کاراکتر مخصوص دیگری که ()printf‌ آنرا مراعات می کند درصد (%) است که از ()printf میخواهد کاراکترهای بعد از خود را در هنگام چاپ با مقدار یک متغییر مشخص جایگزین نماید. d% رشته کاراکتری است که یک متغییر از نوع داده‌ای Int ‌را برای چاپ با استفاده از سیستم شمارش بر مبنای ده یا ده‌دهی نمایندگی می کند. به ازای هر d% در رشته قالب بندی شما باید به تابع ()printf بفهمانید که چه متغییری را قصد جایگزین کردن با آن دارید. در نمونه زیر برخی استفاده‌های بیشتر تابع ()printf را مشاهده می‌کنید:

    نمونه 3.4 more_printf.c
    کد:
     
    Int
    main()
    {
      int one = 1;
      int two = 2;
      int three = 4;  /* the values are unimportant here */
    
      printf( "one ==\t%d\ntwo ==\t%d\nthree ==\t%d\n", one, two, three );
    
      return 0;
    }
    3.5 عملیات ریاضی ساده
    در ابتدای این فصل اشاره کردیم که یک برنامه معمولا با انجام عملیات بر روی داده‌ها سر و کار دارد. با به کار گیری علایم استاندارد ریاضی انجام عملیات ریاضی در زبان c به صورت بسیار آسان قابل فهم و خواندن است. به نمونه زیر توجه کنید:

    نمونه 3.5 wages.c
    کد:
     
    int
    main()
    {
      int hours_per_day;
      int days_per_week;
    
      hours_per_day = 8;
      days_per_week = 5;
    
      printf("I work %d hours a week.\n", (days_per_week * hours_per_day) );
    
      printf("%d %d hour days\n", days_per_week, hours_per_day);
    
      return 0;
    }
    3.6 متغییر‌های عمومی و محلی
    متغییر‌هایی که تا به حال از آنها استفاده کردیم متغییرهای محلی (local variables) بودند این متغییر‌ها در همان تابعی که قصد استفاده از آنها را داریم تعریف شده پس از اجرای تابع نابود می شوند و همانطور که گفتیم تا قبل از انتساب مقدار آنها غیر قابل پیش بینی است. دسته دیگری از متغییر‌ها که متغییر‌های عمومی (global variables) نام دارند در خارج از توابع و معمولا بالای تابع ()main تعریف می شوند. این متغییر‌ها از داخل تمام توابعی بعد از اعلان آنها تعریف شوند قابل استفاده بوده در ابتدای اجرای برنامه‌ایجاد و تا پایان اجرای برنامه در حافظه باقی می مانند. بر خلاف متغییر‌های محلی به محض اعلان این متغییر‌ها مقدار اولیه صفر به آنها تعلق می گیرد.

    نمونه 3.6 global_variable.c
    کد:
     
    #include 
    int global_varialble;
    int first_function(void);
    int
    main()            
    {
      printf("The first value of global_varialbles is %d \n",global_varialble);
      first_function();
      return 0;
    }
    int
    first_function()  
    {
    global_varialble = 5;
    printf("Now the value of global_varialble is %d \n",global_varialble);
      return 0;
    }
    3.7 حوضه متغییر
    منظور از حوضه (scope) یک متغییر محدوده‌ایست که متغییر در آن قابل دسترسی و استفاده می باشد. به عنوان نمونه همانطور که در بالا دیدیم حوضه متغییر‌های محلی همان تابعی بود که در آن تعریف شده بودند و حوضه متغییر‌های عمومی تمام توابعی بود که بعد از اعلان آن متغییر‌ها تعریف می شدند.
    3.8 کلاسهای حافظه
    کلاس حافظه خصوصیتی از متغییر است که طول عمر و حوضه متغییر را مشخص می کند.منظور از طول عمر زمان ایجاد و نابود شدن متغییر می باشد. کلاسهای حافظه انواع گوناگونی دارد که در این جا دو مورد از پرکاربرد ترین آنها یعنی کلاس حافظه‌ایستا (static) و کلاس حافظه خارجی (external) را توضیح می دهیم:
    3.8.1 کلاس حافظه خارجی
    بعضی اوقات کدهای برنامه ما در بیش از یک فایل قرار دارد.شما میتوانید از متغییر‌های عمومی که در یکی از فایلها اعلان شده است در فایل دیگری استفاده کنید به شرط اینکه آن متغییر را درفایل دوم نیز اعلان نمایید. دستور اعلان متغییر در فایل دوم باید با کلمه کلیدی extern آغاز گردد. در نمونه زیر کدهای برنامه از دو فایل تشکیل شده است:
    نمونه 3.7 main.c
    کد:
    int main()
    {
      extern int my_var; 
    my_var = 500;
     print_value();  
    return 0;
    }
    نمونه 3.8 secondary.c
    کد:
    	 #include 
    int my_var;
    void print_value()
    {
    printf("my_var = %d\n", my_var);
    }


  2. #12
    آواتار ELVIS

    تاريخ عضويت : Nov 2008
    شهر : TEHRAN
    پست ها : 11,754
    سپاس
    3,857
    تشکر شده 4,824 بار در 2,287 پست

    پيش گزيده نقل قول : برنامه نویسی c در سیستم عامل gnu

    3.8.2 کلاس حافظه‌ایستا
    در زبان C هرگاه یک تابع را بیش از یک بار فراخوانی کنیم با هر بار فراخوانی تابع متغییر‌های محلی تعریف شده در تابع از ابتدا ایجاد شده سپس مقدار اولیه گرفته و در انتهای اجرای تابع نابود می شوند اما اگر این متغییر‌ها از نوع کلاس حافظه‌ایستا باشند تنها یک بار مقدار اولیه گرفته در هنگام خروج از تابع آخرین مقدار خود را حفظ کرده و تا انتهای اجرای برنامه در حافظه باقی می مانند. برای اینکه متغییر‌های محلی یک تابع را از نوع ایستا تعریف کنیم باید در دستور اعلان آنها ابتدا کلمه کلیدی static را ذکر نماییم تا آن متغییر از نوع محلی ایستا تعریف شود. اما متغییر‌های عمومی به طور پیش فرض از نوع ایستا بوده و ذکر یا عدم ذکر کلمه کلیدی static در ابتدای فرمان اعلان آنها بی تاثیر است. در صورتیکه متغییر محلی از نوع ایستا تعریف نشود کلاس حافظه آن از نوع اتوماتیک (automatic) خواهد بود.کلاس حافظه اتوماتیک با آوردن کلمه کلیدی auto‌ در ابتدای دستور اعلان متغییر مشخص می شود. البته چون متغییر‌های محلی در صورتیکه کلاس حافظه دیگری برای آنها بیان نشود به طور پیش فرض از نوع اتوماتیک هستند آوردن و یا نیاوردن کلمه کلیدی auto‌در ابتدای دستور اعلان آنها یکسان است.

    نمونه 3.9 static_variable.c
    کد:
    #include 
    int first_function(void);
    int
    main()            
    {
      first_function();
      first_function();
      first_function();
    
      return 0;
    }
    int
    first_function()
    {
      int x=0;
      static int y=0;
      printf(“automatic x = %d   static y = %d \n”,x,y);  
      x=x+1;
      y=y+1;
      return 0;
    }
    3.9 متغییر‌های غیر قابل تغییر
    یک عادت خوب برنامه نویس اینست که هیچ گاه عددی غیر از صفر یا یک را در خلال کدهایتان به کار نبرید!. اگر به ثابت عددی دیگری غیر از صفر و یک احتیاج داشتید آنرا تبدیل به یک متغییر از نوع غیرقابل تغییر (constant) نمایید. برای این کار در ابتدای دستور اعلان متغییر از کلمه کلیدی const استفاده نمایید. نمونه :
    Const int my_age = 20;
    مقدار این متغییر در تمام طول برنامه 20 باقی خواهد ماند و هر کجا که قصد تغییر آن را داشته باشید با خطای کامپایلر مواجه خواهید شد. عدد 20 معنای مختصری می دهد در حالیکه مشخصه‌ای مانند my_age اطلاعات بیشتری در مورد عملی که تابع انجام می دهد در اختیار ما قرار می دهد. مزیت دیگر استفاده از متغییر‌های غیر قابل تغییر در اینست که برای تغییر مقدار ثابت عددی باید در تمام برنامه به دنبال آن ثابت گشته و آن را تغییر دهیم ولی برای تغییر مقدار متغییر‌های غیر قابل تغییر تنها فرمان اعلان آنها را تغییر می دهیم.
    فصل چهار : کنترل جریان
    زبان برنامه نویسی c دو سبک برای تصمیم گیری فراهم نموده است : حلقه‌ها (looping) انشعاب‌ها(Branching). انشعاب یعنی تصمیم گیری در مورد اینکه چه عملیاتی انجام شود و حلقه یعنی اینکه یک عملیات خاص چند مرتبه تکرار شود.
    4.1 انشعاب
    وجه تسمیه انشعاب به‌این دلیل است که برنامه در مواجه با دو انشعاب در کد خود انتخاب می کند که کدام یک را ادامه دهد. دستور if یکی از ساده ترین ساختار‌های انشعاب است. این دستور از یک شرط (expression)که داخل پرانتز قرار گرفته و نیز یک دستور(statement) و یا بلوکی از دستورات(block of statements) که توسط دو آکولاد باز و بسته یعنی { و } محاصره شده اند تشکیل شده است.در صورتیکه شرط صحیح باشد ( ارزشی غیر صفر داشته باشد) در آنصورت دستور و یا بلوک دستورات اجرا خواهند شد و در غیر این صورت دستورات نادیده گرفته خواهند شد. دستور if ‌ دارای یکی از دو شکل کلی زیر است:
    فرم کلی اول با یک دستور
    کد:
     	 if (expression)
      statement;
    فرم کلی دوم با بلوک دستورات
    کد:
    if (expression)
      {
        statement1;
        statement2;
        statement3;
      }
    در زیر نمونه‌ی ساده از کاربرد دستور if را مشاهده می‌کنید: نمونه 4.1 using_if.c
    کد:
    #include 
    
    int
    main()
    {
      int cows = 6;
    
      if (cows > 1)
        printf("We have cows\n");
    
      if (cows > 10)
        printf("loads of them!\n");
    
      return 0;
    }
    کامپایل – اجرا و خروجی برنامه بالا به صورت زیر است:
    کد:
    ciaran@pooh:~/$ gcc -Wall -Werror -o cows using_if.c
    ciaran@pooh:~/$ ./cows
    We have cows
    ciaran@pooh:~/$

    دستور ()printf دوم در کد بالا به دلیل اشتباه بودن شرط آن ( با ارزش صفر) اجرا نمی گردد. 4.2if…else
    شکل دومی از دستور if‌ نیز وجود دارد که به شما امکان می دهد تا بلوکی از کدها را مشخص نموده تا در صورت اشتباه بودن شرط اجرا شوند. این ساختار با نام دستور if ... else شهرت دارد و به وسیله قرار دادن کلمه کلیدی reserved word)) else و یک بلوک کد دیگر در انتهای ساختار معمولی if شکل می گیرد. پس ار تست شرط دستر if یکی از دو بلوک کد بسته به صحیح یا غیر صحیح بودن شرط اجرا خواهند شد. به نمونه زیر توجه کنید:

    نمونه 4.2 cows2.c
    کد:
    int
    main()
    {
      int cows = 0;
    
      if (cows > 1)
        {
          printf("We have cows\n");
          printf("%d cows to be precise\n", cows);
        }
      else
        {
          if (cows == 0)
            printf("We have no cows at all\n");
          else
            printf("We have only one cow\n");
        }
    
      if (cows > 10)
        printf("Maybe too many cows.\n");
    
      return 0;
    }
    شما اکنون باید قادر به حدس زدن خروجی برنامه باشید:
    خروجی برنامه
    کد:
    ciaran@pooh:~/$ ./cows2
    We have no cows at all
    ciaran@pooh:~/$
    در نمونه بالا یک دستور if … else در درون یک دستور if … else دیگر وجو داشت. این ساختار در زبان c کاملا منطقی و پرکاربرد است. 4.3 دستور switch
    این ساختار انشعاب نسبت ساختار‌های قبلی قدری پیچیده تر است. اگر چه دستور switch بسیار انعطاف‌پذیر است اما تنها برای تست کردن داده‌های صحیح و کاراکتری کاربرد دارد. فرم کلی آن به صورت زیر است:
    فرم کلی ساختار switch
    کد:
    switch (integer or character expression)
    {
      case constant1 : statement1;
      break;          
    
      case constant2 : statement2;
      break;          
    
      case constant3 : statement3;
      break;          
      
    }
    با اجرای دستور switch ابتدا عبارت داخل پرانتز با تمام مقادیری که جلوی آنها عبارتهای case نوشته شده مقایسه شده و با هرکدام از آنها که برابر بود دستورات بعد از آن تا رسیدن به عبارت break اجرا می شود.سپس با اجرای دستور break کامپایلر از حلقه خارج می شود.

    نمونه 4.3 morse.c
    کد:
    #include 
    
    int main ();
    void morse (int);
    
    
    int main ()
    {
      int digit;
    
      printf ("Enter any digit in the range 0 to 9: ");
      scanf ("%d", &digit);
    
      if ((digit < 0) || (digit > 9))
      {
        printf ("Your number was not in the range 0 to 9.\n");
      }
      else
      {
        printf ("The Morse code of that digit is ");
        morse (digit);
      }
      return 0;
    }
    
    
    void morse (int digit)        /* print out Morse code */
    {
      switch (digit)
      {
        case 0 : printf ("-----");
          break;
        case 1 : printf (".----");
          break;
        case 2 : printf ("..---");
          break;
        case 3 : printf ("...--");
          break;
        case 4 : printf ("....-");
          break;
        case 5 : printf (".....");
          break;
        case 6 : printf ("-....");
          break;
        case 7 : printf ("--...");
          break;
        case 8 : printf ("---..");
          break;
        case 9 : printf ("----.");
      }
      printf ("\n\n");
    }
    نمونه 4.4 fs.c
    کد:
    #include 
    
    int main ()
    {
      printf ("Will you join the Free Software movement? ");
      if (yes())
      {
        printf("Great!  The price of freedom is eternal vigilance!\n\n");
      }
      else
      {
        printf("Too bad.  Maybe next life...\n\n");
      }
    
      return 0;
    }
    
    
    int yes()
    {
      switch (getchar())
      {
        case 'y' :
        case 'Y' : return 1;
        default  : return 0;
      }
    }
    4.3 حلقه‌ها
    حلقه‌ها راهی را برای تکرار فرمان‌ها و نیز کنترل اینکه فرمان‌ها چند مرتبه انجام شود فراهم می‌کنند.فرضا شما قصد دارید حروف الفبا را بر روی صفحه نمایش چاپ کنید. می توانید این کار را با یک بار فراخوانی تابع ()printf انجام دهید. این یک راه حل برای انجام این کار است اما به نظر نمی رسد که بهترین راه باشد.حال بر فرض اگر خواسته باشید اعداد یک تا هزار را در یک ستون چاپ کنید چه می‌کنید؟ آیا باز هم از یک تابع ()printf بسیار طولانی استفاده می‌کنید و یا هزار بار تابع ()printf را در کدهایتان تایپ می‌کنید؟!. البته می توانید راه حل‌های ذکر شده را به کار برید ولی بهتر است انجام کارهای تکراری را به کامپیوتر سپرده و وقت خود را صرف پرداختن به قسمت‌های جذاب تر برنامه خود کنید.


  3. #13
    آواتار ELVIS

    تاريخ عضويت : Nov 2008
    شهر : TEHRAN
    پست ها : 11,754
    سپاس
    3,857
    تشکر شده 4,824 بار در 2,287 پست

    پيش گزيده نقل قول : برنامه نویسی c در سیستم عامل gnu

    4.4 حلقه while
    اساسی ترین حلقه در زبان c حلقه while است.دستور while‌ کاری شبیه تکرار دستور if را انجام می دهد. اگر شرط دستور صحیح باشد دستورات انجام می شوند با این تفاوت که پس از اجرای دستورات شرط مجددا بررسی می شود تا در صورتیکه هنوز صحیح باشد دستورات بار دیگر انجام شوند. و این حلقه تا زمانی تکرار می شود که شرط مقدار غلط پیدا کند. در صورتیکه در همان مرتبه اول بررسی شرط مقدار ناصحیح داشته باشد دستورات به هیچ وجه اجرا نمی گردند. به عبارت دیگر درصورتیکه شرط هرگز مقدار غلط پیدا نکند حلقه به طور بی نهایت تکرار می شود. برای کنترل تعداد دفعاتی که یک حلقه کدهایش را اجرا می کند شما حداقل یک متغییر در جمله شرط دارید که در بلوک کد متعاقب تغییر می یابد. این موضوع به جمله شرط امکان می دهد در برخی مراحل نادرست گردد. نمونه‌ی را که پیش رو دارید یک بازی ساده حدس زدن عدد است:

    نمونه 4.5 guess_my_number.c
    کد:
    #include 
    int
    main()
    {
      const int MAGIC_NUMBER = 6;
      int guessed_number;
    
      printf("Try to guess what number I'm thinking of\n");
      printf("HINT: It's a number between 1 and 10\n");
    
      printf("enter your guess: ");
      scanf("%d", &guessed_number);
    
      while (guessed_number != MAGIC_NUMBER);
        {
          printf("enter your guess: ");
          scanf("%d", &guessed_number);
        }
    
      printf("you win.\n")
    
      return 0;
    }
    بلوک کد حلقه while ‌در نمونه بالا تا زمانی که بازیکن عدد 6 را حدس بزند مرتب تکرار می شود. 4.5 حلقه for
    معمولا در مواردیکه تعداد دفعات تکرار حلقه از قبل معیین است از حلقه for استفاده می کنیم. در ساختار حلقه for متغییری وجود دارد که تعداد دفعات تکرار حلقه را تعیین می کند و اصطلاحا شمارنده نامیده می شود. در پرانتز بعد از کلمه for سه عبارت وجود دارند که توسط سمی کالون (;) از یکدیگر جدا شده اند. اولین عبارت مقدار اولیه متغییر شمارنده را مشخص می کند. آخرین عبارت معیین می کند که با هر بار اجرای دستورات حلقه مقدار متغییر شمارنده به چه میزان اضافه یا کم می شود و بالاخره عبارت وسط که شرط حلقه است مشخص می کند حلقه تا چه زمانی باید اجرا شود.
    فرم کلی حلقه if به صورت زیر است:
    کد:
    for (initialization; expression; action )
    {
        statement1;
        statement2;
        statement3;
      }
    در نمونه زیر متغییر i متغییر شمارنده حلقه for می باشد:

    نمونه 4.6 for_ten.c
    کد:
    #include 
    
    int
    main()
    {
      int i;
    
      /* display the numbers from 0 to 9 */
      for (i = 0; i < 10; i++)
        printf("%d\n", i);
    
      return 0;
    }
    4.6 حلقه do… while
    حلقه do … while شبیه حلقه while عمل می کند با این تفاوت که شرط حلقه به جای ابتدا در انتهای حلقه بررسی می شود. پس حتی اگر شرط حلقه مقدار نادرست داشته باشد دستورات حلقه حداقل یک بار اجرا می شوند. در ذیل نمونه‌ی از کاربرد این حلقه آمده است:

    نمونه 4.7 guess_my_number.c
    کد:
    #include 
    
    
    int
    main()
    {
      const int MAGIC_NUMBER = 6;
      int guessed_number;
    
      printf("Try to guess what number I'm thinking of\n");
      printf("HINT: It's a number between 1 and 10\n");
    
      do
        {
          printf("enter your guess: ");
          scanf("%d", &guessed_number);
        }
      while (guessed_number != MAGIC_NUMBER);
    
      printf("you win.\n")
    
      return 0;
    }
    4.7 عملگر شرطی
    عملگر ?: شبیه دستور if … else عمل می کند با این تفاوت که چون یک عملگر است ( و نه یک دستور )در میان عبارت‌ها نیز کار برد دارد.

    نمونه 4.8 apples.c
    کد:
    #include 
     
    int
    main()
    {
      apples = 6;
     
      printf("I have %d apple%s ", apples, (apples == 1) ? "" : "s");
     
      return 0;
    }
    ?: تنها عملگر سه گانه در زبان c است.در نمونه بالا عبارت (apples == 1) شرط ماست که درستی آن بررسی می شود. در صورتی که شرط صحیح باشد ( که در نمونه بالا نیست ) در خروجی کلمه apple بدون s و در صورت اشتباه بودن شرط کلمه apple همراه با s چاپ خواهد شد. 4.9 break و continue
    زبان c راه بسیار ساده‌ای برای خارج شدن از حلقه‌های تکرار در مواقع لزوم فراهم می‌کند. برای این کار باید از دستور break که پیش از این به منظور بیرون جهیدن از ساختار switch از آن بهره برده بودیم استفاده کرد. نمونه زیر اعداد یک تا 12 را چاپ می کند:

    نمونه 4.9 break.c #include int main() { for (i = 1; i <= 20; i++) { if (i == 12) { break; } printf ( “%d “ ,i); } return 0; } به کار بردن دستور continue در یک حلقه تکرار باعث می شود تا دستورات بعدی نادیده گرفته شده و مفسر به ابتدای حلقه باز گردد. نمونه زیر حاصل تقسیم عدد بیست را بر اعداد محدوده منفی ده تا مثبت ده چاپ می کند اما برای جلوگیری از تقسیم شدن عدد بیست بر عدد صفر از یک شرط و دستور continue استفاده شده است.
    نمونه 4.10 continue.c
    کد:
    #include 
    int
    main()
    {
     
    for (i = -10; i <= 10; i++)
       {
       if (i == 0)
          {
          continue;
          }
       printf ("%d", 20/i);
       }
    return 0;
    }
    فصل پنجم : اشاره گر‌ها

    5.1 اصول اولیه
    محدودیتی که ممکن است شما نیز متوجه آن شده باشید این است که توابع تنها از طریق مقادیر بازگشتی خود در برنامه شما تاثیر گذراند. با این وصف اگر بخواهید تا یک تابع با بیش از یک متغییر سر و کار داشته باشد چه خواهید کرد؟ پاسخ استفاده از اشاره گر‌هاست.
    یک اشاره گر نوع خاصی از متغییر‌هاست که برای نگهداری آدرس‌های حافظه کاربرد دارد یعنی یک اشاره گر آدرس متغییر دیگری را به عنوان مقدار خود نگهداری می‌کند. اعلان اشاره گر‌ها به مانند اعلان متغییر‌های عادی است با این تفاوت که شما باید یک کاراکتر ستاره “*” را به ابتدای نام اشاره گر اضافه کنید. دو عملگر جدید برای کار با اشاره گر‌ها وجود دارد که شما باید آنها را بشناسید:عملگر & و عملگر * که هر دو جزء عملگر‌های یگانی پیشوندی محسوب می شوند . زمانی که شما یک علامت آمپرسند "&" را در آغاز نام یک متغییر اضافه می کنید شما آدرس آن متغییر را دریافت خواهید کرد که می تواند در یک اشاره گر نگهداری شود. اما زمانیکه علامت ستاره را در آغاز نام یک اشاره گر به کار می برید شما مقدار نگهداری شده در آدرس حافظه‌ای را که اشاره گر به آن اشاره می کند دریافت خواهید کرد. مثل همیشه بحث را با یک نمونه دنبال می کنیم :

    نمونه 5.1 pointers_are_simple.c
    کد:
    #include 
    
    int
    main()
    {
      int my_variable = 6, other_variable = 10;
      int *my_pointer;
    
      printf("the address of my_variable is    : %p\n", &my_variable);
      printf("the address of other_variable is : %p\n", &other_variable);
    
      my_pointer = &my_variable;
    
      printf("\nafter \"my_pointer = &my_variable\":\n");
      printf("\tthe value of my_pointer is %p\n", my_pointer);
      printf("\tthe value at that address is %d\n", *my_pointer);
    
      my_pointer = &other_variable;
    
      printf("\nafter \"my_pointer = &other_variable\":\n");
      printf("\tthe value of my_pointer is %p\n", my_pointer);
      printf("\tthe value at that address is %d\n", *my_pointer);
    
      return 0;
    }
    خروجی برنامه آدرس حافظه دو متغییر را به شما نشان می دهد. مقادیر در رایانه من با رایانه شما متفاوت خواهند بود. در تابع ()printf همانطور که شما هم متوجه شده‌اید از %p برای نمایش آدرس‌ها بهره بردیم که شاخص تبدیل برای تمام اشاره گر‌هاست. به هر حال خروجی برنامه در رایانه من به صورت زیر بود :
    خروجی برنامه
    کد:
    the address of my_variable is    : 0xbffffa18
    the address of other_variable is : 0xbffffa14
    
    after "my_pointer = &my_variable":
            the value of my_pointer is 0xbffffa18
            the value at that address is 6
    
    after "my_pointer = &other_variable":
            the value of my_pointer is 0xbffffa14
            the value at that address is 10
    5.2 آدرس یک متغییر
    برنامه‌ها در زمان اجرا ، وقتی به اعلان یک متغییر می رسند از سیستم عامل درخواست تخصیص مقداری حافظه برای آن متغییر را می نمایند. سیتم عامل قطعه‌ای از حافظه را که اندازه آن برای نگهداری مقادیر متغییر مناسب است انتخاب و آدرس آن را به برنامه اعلام می‌کند. هر زمان که برنامه قصد خواندن داده‌هایی را که درون آن متغییر نگهداری می شوند داشته باشد ، به آدرس حافظه آن متغییر مراجعه کرده و به برابر با اندازه آن متغییر بایت‌های حافظه را می خواند. در صورتی که شما یک بار دیگر برنامه‌ای را که در اغاز این فصل ذکر کردیم اجرا کنید ممکن است نتایج مشابه یا متفاوتی را نسبت به بار اول در مورد آدرس‌های حافظه بدست آورید که‌این امر بستگی به شرایط سیستم شما دارد اما حتی اگر در بار دوم نتایج یکسانی را نسبت به یار اول بدست آورید هیچ تضمینی برای اینکه اجرای برنامه در فردا نیز همین نتایج را داشته باشد وجود نخواهد داشت. در واقع این احتمال که فردا نیز برنامه همین نتایج را داشته باشد تقریبا محال است.


  4. #14
    آواتار ELVIS

    تاريخ عضويت : Nov 2008
    شهر : TEHRAN
    پست ها : 11,754
    سپاس
    3,857
    تشکر شده 4,824 بار در 2,287 پست

    پيش گزيده نقل قول : برنامه نویسی c در سیستم عامل gnu

    5.3 اشاره گر‌ها در جایگاه آرگومان (نشانوند )‌های تابع
    یکی از بهترین مزیت‌های اشاره گر‌ها این است که آن‌ها به توابع این امکان را می دهند تا متغییر‌هایی در خارج از حوزه خود را تغییر دهند. با ارسال یک اشاره گر برای یک تابع ، شما به آن تابع امکان خواندن و نوشتن بر روی داده‌های نگهداری شده در متغییر مربوط به آن اشاره گر را می دهید.
    مثلا شما قصد نوشتن تابعی را دارید که مقادیر دو متغییر را جا به جا می‌کند. بدون بهره گیری از اشاره گر‌ها نوشتن این برنامه غیر ممکن است. در زیر کدهای برنامه مورد نظر را می بینید:
    کد:
    Example 5-2. swap_ints.c
    #include 
    
    int swap_ints(int *first_number, int *second_number);
    
    int
    main()
    {
      int a = 4, b = 7;
    
      printf("pre-swap values are: a == %d, b == %d\n", a, b)
    
      swap_ints(&a, &b);
    
      printf("post-swap values are: a == %d, b == %d\n", a, b)
    
      return 0;
    }
    
    int
    swap_ints(int *first_number, int *second_number)
    {
      int temp;
    
      /* temp = "what is pointed to by" first_number; etc... */
      temp = *first_number;
      *first_number = *second_number;
      *second_number = temp;
    
      return 0;
    }
    همانطور که مشاهده می کنید اعلان تابع () swap_ints به کامپایلر gcc می گوید که انتظار دو اشاره گر ( آدرس متغییر )را داشته باشد. همچنین عملگر & به منظور ارسال آدرس دو متغییر به جای مقدار آن‌ها به کار رفته است.
    موفق باشید


گفتگو هاي مشابه

  1. استفاده همزمان از چندین سیستم عامل بروی یک سیستم عامل با VirtualBox 2.1.4
    By Shaghayegh in forum نرم افزارهای یوتیلیتی(Utility) و متفرقه
    پاسخ ها: 0
    آخرين پست: 04-19-2009, 08:38 AM
  2. عالم ذر
    By نقاب in forum مقالات
    پاسخ ها: 1
    آخرين پست: 11-04-2008, 04:37 PM
  3. پاسخ ها: 0
    آخرين پست: 10-29-2008, 12:53 PM
  4. پاسخ ها: 17
    آخرين پست: 04-02-2008, 01:01 AM
  5. برنامه اي عالي براي از بين بردن محدوديت زماني برنامه
    By k!ng in forum نرم افزارهای یوتیلیتی(Utility) و متفرقه
    پاسخ ها: 6
    آخرين پست: 09-23-2006, 12:45 AM

قوانين ايجاد گفتگو در تالار

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  • BB code is روشن
  • شکلک ها روشن هستند
  • کد [IMG] اکنون روشن ميباشد
  • HTML کد خاموش مي باشد