آموزش زبان C (قسمت یازدهم:FunctionArguments)

به آموزش زبان C (قسمت یازدهم – Function arguments) خوش اومدید.

آرگومان ها یا پارامترهای توابع به وسیله مقادیر ورودی یاخروجی ارسال یا دریافت می شوند که این یعنی انگار ما یه کپی از این مقادیر در داخل یا خارج توابع داریم و از اونها مدام استفاده می کنیم. اما اگر ما اشاره گرها به مقادیر را به جای خود مقادیر استفاده کنیم چه می شود؟ اینکار مارو قادر میکنه کنترل توابع را بر روی متغیرها و ساختارها از توابع مادر بدست بگیریم نه اینکه فقط یه کپی از آن داشته باشیم.

بزارید اینجوری بگیم که ما میخوایم یک تابع بنویسیم که مقدار یک عدد را یکی یکی اضافه می کند که اسمشو هم گذاشتیم addone.

کد زیر را در نظر بگیرید که کار نمیکنه:

void addone(int n) {
    n++;
}
int n;
printf("Before: %d\n", n);
addone(n);
printf("After: %d\n", n);

اما کد زیر کار خواهد کرد:

void addone(int * n) {
    (*n)++;
}
int n;
printf("Before: %d\n", n);
addone(&n);
printf("After: %d\n", n);

اما تفاوت چیه؟ تفاوت اینه که ورژن دوم از تابع addone  یک اشاره گر به متغیر n را به عنوان آرگومان دریافت می کند، و سپس می تواند آن را دستکاری کند، زیرا می داند در کجای حافظه است.

توجه داشته باشید وقتیکه ما تابع addone را صدا می زنیم، ما باید رفرنس (اشاره گر) به متغیر n را عبور بدیم نه خود متغیر. با این کار تابع، آدرس حافظه آن متغیر را می فهمد نه اینکه یک کپی از آن را بخواهد.

اشاره گرها به ساختارها:

فرض کنید می خواهیم یک تابع ایجاد کنیم که می خواهد یک نقطه را هم در جهت (x) و هم (y) حرکت دهد، که اسم تابع رو گذاشتیم move. به جای اینکه دو اشاره گر بفرستیم درون تابع با استفاده از اشاره گر ساختارها می توانیم یک نقطه بفرستیم فقط:

void move(point * p) {
    (*p).x++;
    (*p).y++;
}

اگرچه، اگر ما بخوایم به یک ساختار ارجاع مجدد بدیم و به یکی از اعضای داخلیش دسترسی داشته باشیم، ما یک سینتکس مختصری براش داریم، چون که این عملکرد به صورت گسترده در ساختارهای دادگان استفاده می شود ما می توانیم این تابع را با استفاده از سینتکس زیر بازنویسی کنیم. یعنی جای (.) از (<-) استفاده می کنیم . این کدو قشنگتر میکنه 🙂

void move(point * p) {
    p->x++;
    p->y++;
}

تمرین:

در کد زیر یک تابع بنویسید با نام birthday ، که به سن (age) شخص (person) یکسال اضافه می کند:

#include <stdio.h> 
typedef struct {
  char * name;
  int age;
} person;
/* function declaration */
void birthday(person * p);
/* write your function here */
int main() {
  person john;
  john.name = "John";
  john.age = 27;
  printf("%s is %d years old.\n", john.name, john.age);
  birthday(&john);
  printf("Happy birthday! %s is now %d years old.\n", john.name, john.age);
  return 0;
}

جواب تمرین:

#include <stdio.h> 
typedef struct {
  char * name;
  int age;
} person;
/* function declaration */
void birthday(person * p);
void birthday(person * p){
    (*p).age += 1;
}
int main() {
  person john;
  john.name = "John";
  john.age = 27;
  printf("%s is %d years old.\n", john.name, john.age);
  birthday(&john);
  printf("Happy birthday! %s is now %d years old.\n", john.name, john.age);
  return 0;
}

پایان آموزش زبان C (قسمت یازدهم – Function arguments)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

قبلا حساب کاربری ایجاد کرده اید؟
گذرواژه خود را فراموش کرده اید؟
Loading...