سورس سرا – آموزش برنامه نویسی https://sourcesara.com سایت سورس سرا بزرگترین و جامع ترین سایت در زمینه آموزش برنامه نویسی و طراحی سایت می باشد که با کیفیت عالی و مثال های مختلف برنامه نویسی سعی در پیشرفت کاربران در امر برنامه نویسی را دارد Sat, 22 Sep 2018 05:19:48 +0000 fa-IR hourly 1 خروجی تابع از نوع اشاره گر در زبان C – آموزش زبان C https://sourcesara.com/c-return-pointer-from-functions/ https://sourcesara.com/c-return-pointer-from-functions/#respond Sat, 22 Sep 2018 05:16:56 +0000 https://sourcesara.com/?p=4248 خروجی تابع از نوع اشاره گر در زبان C بازگشت دادن یک اشاره گر از یک تابع شبیه بازگشت دادن یک آرایه از یک تابع است. زیرا آرایه نیز اشاره گر ثابت است. برای این که یک تابع بتواند یک اشاره گر را به عنوان خروجی برگداند باید به شکل […]

نوشته خروجی تابع از نوع اشاره گر در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
c return pointer from functions 4248 خروجی تابع از نوع اشاره گر در زبان C   آموزش زبان C

خروجی تابع از نوع اشاره گر در زبان C

بازگشت دادن یک اشاره گر از یک تابع شبیه بازگشت دادن یک آرایه از یک تابع است. زیرا آرایه نیز اشاره گر ثابت است. برای این که یک تابع بتواند یک اشاره گر را به عنوان خروجی برگداند باید به شکل زیر تعریف شود:

int * myFunction() {
.
.
.
}

نکته مهمی که باید به آن توجه کنید این است که زبان C نمی تواند آدرس متغیری که در بلوک خودش است (یعنی به عنوان متغیر محلی آن تابع است) را به خارج از تابع بفرستد. بنابراین اشاره گری که قرار است بازگشت داده شود باید به صورت static تعریف شود.

تابع زیر را در نظر بگیرید که ۱۰ عدد تصادفی تولید می کند و آن ها را در قالب یک آرایه باز می گرداند.

#include <stdio.h>
#include <time.h>
/* function to generate and return random numbers. */
int * getRandom( ) {
   static int  r[10];
   int i;
   /* set the seed */
   srand( (unsigned)time( NULL ) );
   for ( i = 0; i < 10; ++i) {
      r[i] = rand();
      printf("%d\n", r[i] );
   }
   return r;
} 
/* main function to call above defined function */
int main () {
   /* a pointer to an int */
   int *p;
   int i;
   p = getRandom();
   for ( i = 0; i < 10; i++ ) {
      printf("*(p + [%d]) : %d\n", i, *(p + i) );
   }
   return 0;
}

امتحان کنید

زمانی که کد بالا توسط کامپایلر C و اجرا شود، نتیجه زیر را تولید خواهد کرد:

1523198053
1187214107
1108300978
430494959
1421301276
930971084
123250484
106932140
1604461820
149169022
*(p + [0]) : 1523198053
*(p + [1]) : 1187214107
*(p + [2]) : 1108300978
*(p + [3]) : 430494959
*(p + [4]) : 1421301276
*(p + [5]) : 930971084
*(p + [6]) : 123250484
*(p + [7]) : 106932140
*(p + [8]) : 1604461820
*(p + [9]) : 149169022

نوشته خروجی تابع از نوع اشاره گر در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
https://sourcesara.com/c-return-pointer-from-functions/feed/ 0
ارسال اشاره گر به تابع در زبان C – آموزش زبان C https://sourcesara.com/c-passing-pointers-to-functions/ https://sourcesara.com/c-passing-pointers-to-functions/#respond Sat, 22 Sep 2018 04:38:21 +0000 https://sourcesara.com/?p=4246 ارسال اشاره گر به تابع در زبان C در زبان برنامه نویسی C می توانید یک اشاره گر به عنوان آرگومان به یک تابع بفرستید، برای این کار فقط کافیست پارامتر تابع را از نوع اشاره گر تعریف کنید. در مثال زیر ما یک اشاره گر از نوع unsigned long […]

نوشته ارسال اشاره گر به تابع در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
c passing pointers to functions 4246 ارسال اشاره گر به تابع در زبان C   آموزش زبان C

ارسال اشاره گر به تابع در زبان C

در زبان برنامه نویسی C می توانید یک اشاره گر به عنوان آرگومان به یک تابع بفرستید، برای این کار فقط کافیست پارامتر تابع را از نوع اشاره گر تعریف کنید. در مثال زیر ما یک اشاره گر از نوع unsigned long به تابع ارسال می کنیم سپس مقدار آن را درون تابع تغییر می دهیم.

#include <stdio.h>
#include <time.h>
void getSeconds(unsigned long *par);
int main () {
   unsigned long sec;
   getSeconds( &sec );
   /* print the actual value */
   printf("Number of seconds: %ld\n", sec );
   return 0;
}
void getSeconds(unsigned long *par) {
   /* get the current number of seconds */
   *par = time( NULL );
   return;
}

امتحان کنید

زمانی که کد بالا توسط کامپایلر C و اجرا شود، نتیجه زیر را تولید خواهد کرد:

Number of seconds :1294450468

مثال زیر هم می تواند یک اشاره گر و هم یک آرایه را به عنوان پارامتر قبول کند:

#include <stdio.h>
/* function declaration */
double getAverage(int *arr, int size);
int main () {
   /* an int array with 5 elements */
   int balance[5] = {1000, 2, 3, 17, 50};
   double avg;
   /* pass pointer to the array as an argument */
   avg = getAverage( balance, 5 ) ;
   /* output the returned value  */
   printf("Average value is: %f\n", avg );
   return 0;
}
double getAverage(int *arr, int size) {
   int  i, sum = 0;       
   double avg;          
   for (i = 0; i < size; ++i) {
      sum += arr[i];
   }
   avg = (double)sum / size;
   return avg;
}

امتحان کنید

زمانی که کد بالا توسط کامپایلر و اجرا شود نتیجه زیر را تولید خواهد کرد:

Average value is: 214.40000

نوشته ارسال اشاره گر به تابع در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
https://sourcesara.com/c-passing-pointers-to-functions/feed/ 0
اشاره گر به اشاره گر در زبان C – آموزش زبان C https://sourcesara.com/c-pointer-to-pointer/ https://sourcesara.com/c-pointer-to-pointer/#respond Fri, 21 Sep 2018 18:20:55 +0000 https://sourcesara.com/?p=4244 اشاره گر به اشاره گر در زبان C اشاره گر به اشاره گر را می توان به عنوان زنجیره ای از اشاره گرها در نظر گرفت. به طور معمول یک اشاره گر حاوی آدرس متغیر است. هنگامی که ما یک اشاره گر به یک اشاره گر دیگر تعریف می کنیم، […]

نوشته اشاره گر به اشاره گر در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
c pointer to pointer 4244 اشاره گر به اشاره گر در زبان C   آموزش زبان C

اشاره گر به اشاره گر در زبان C

اشاره گر به اشاره گر را می توان به عنوان زنجیره ای از اشاره گرها در نظر گرفت. به طور معمول یک اشاره گر حاوی آدرس متغیر است. هنگامی که ما یک اشاره گر به یک اشاره گر دیگر تعریف می کنیم، اشاره گر اول شامل آدرس اشاره گر دوم است و اشاره گر دوم هم به موقعیتی که حاوی مقدار واقعی است، اشاره می کند.

c pointer to pointer 4244 1 اشاره گر به اشاره گر در زبان C   آموزش زبان C

متغیری که خود یک اشاره گر است و به یک اشاره گر دیگر اشاره می کند باید با دو علامت * مشخص شود. مانند نمونه زیر:

int **var;

مثال زیر نحوه تعریف و استفاده از اشاره گر به اشاره گر در زبان C را نشان می دهد:

#include <stdio.h>
int main () {
   int  var;
   int  *ptr;
   int  **pptr;
   var = 3000;
   /* take the address of var */
   ptr = &var;
   /* take the address of ptr using address of operator & */
   pptr = &ptr;
   /* take the value using pptr */
   printf("Value of var = %d\n", var );
   printf("Value available at *ptr = %d\n", *ptr );
   printf("Value available at **pptr = %d\n", **pptr);
   return 0;
}

امتحان کنید

زمانی که کد بالا توسط کامپایلر C و اجرا شود، نتیجه زیر را تولید خواهد کرد:

Value of var = 3000
Value available at *ptr = 3000
Value available at **pptr = 3000

نوشته اشاره گر به اشاره گر در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
https://sourcesara.com/c-pointer-to-pointer/feed/ 0
آرایه ای از اشاره گرها در زبان C – آموزش زبان C https://sourcesara.com/c-array-of-pointers/ https://sourcesara.com/c-array-of-pointers/#respond Thu, 20 Sep 2018 06:49:20 +0000 https://sourcesara.com/?p=4242 آرایه ای از اشاره گرها در زبان C قبل از این که مبحث آرایه ای از اشاره گرها را شروع کنیم به مثال زیر که یک آرایه سه عنصری از نوع int دارد، توجه کنید: [crayon-5ba66c454a6df387837982/] زمانی که کد بالا توسط کامپایلر C و اجرا شود، نتیجه زیر را تولید […]

نوشته آرایه ای از اشاره گرها در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
c array of pointers 4242 آرایه ای از اشاره گرها در زبان C   آموزش زبان C

آرایه ای از اشاره گرها در زبان C

قبل از این که مبحث آرایه ای از اشاره گرها را شروع کنیم به مثال زیر که یک آرایه سه عنصری از نوع int دارد، توجه کنید:

#include <stdio.h>
const int MAX = 3;
int main () {
   int  var[] = {10, 100, 200};
   int i;
   for (i = 0; i < MAX; i++) {
      printf("Value of var[%d] = %d\n", i, var[i] );
   }
   return 0;
}

امتحان کنید

زمانی که کد بالا توسط کامپایلر C و اجرا شود، نتیجه زیر را تولید خواهد کرد:

Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200

ممکن است در برنامه نویسی وضعیتی پیش آید که بخواهیم، آرایه ای ایجاد کنیم بتواند اشاره گرها را در خود نگه دارد. در مواقع می توان به صورت زیر عمل کرد:

int *ptr[MAX];

دستور بالا آرایه ای به طول MAX برای نگه داری اشاره گرها ایجاد می کند. این شکل از آرایه به جای آن که مقادیر را در خود ذخیره کند، آدرس آن مقادیر را ذخیره می کند. مثال زیر نحوه تعریف و استفاده از یک آرایه ای از اشاره گرها را نشان می دهد:

#include <stdio.h>
const int MAX = 3;
int main () {
   int  var[] = {10, 100, 200};
   int i, *ptr[MAX];
   for ( i = 0; i < MAX; i++) {
      ptr[i] = &var[i]; /* assign the address of integer. */
   }
   for ( i = 0; i < MAX; i++) {
      printf("Value of var[%d] = %d\n", i, *ptr[i] );
   }
   return 0;
}

امتحان کنید

زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:

Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200

شما همچنین می توانید یک آرایه از اشاره گرهایی از نوع کاراکتر برای ذخیره سازی رشته ها ایجاد کنید:

#include <stdio.h>
const int MAX = 4;
int main () {
   char *names[] = {
      "Zara Ali",
      "Hina Ali",
      "Nuha Ali",
      "Sara Ali"
   };
   int i = 0;
   for ( i = 0; i < MAX; i++) {
      printf("Value of names[%d] = %s\n", i, names[i] );
   }
   return 0;
}

امتحان کنید

زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:

Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali

نوشته آرایه ای از اشاره گرها در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
https://sourcesara.com/c-array-of-pointers/feed/ 0
اشاره گرهای ریاضی در زبان C – آموزش زبان C https://sourcesara.com/c-pointer-arithmetic/ https://sourcesara.com/c-pointer-arithmetic/#respond Thu, 20 Sep 2018 06:21:12 +0000 https://sourcesara.com/?p=4239 اشاره گرهای ریاضی در زبان C اشاره گر در زبان C یک آدرس می باشد که این آدرس به صورت عددی است. بنابراین می توان عملیات ریاضی را بر روی آن انجام داد. چهار عملگر ریاضی در زبان C وجود دارند که در هنگام استفاده از اشاره گرها می توانید […]

نوشته اشاره گرهای ریاضی در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
c pointer arithmetic 4239 اشاره گرهای ریاضی در زبان C   آموزش زبان C

اشاره گرهای ریاضی در زبان C

اشاره گر در زبان C یک آدرس می باشد که این آدرس به صورت عددی است. بنابراین می توان عملیات ریاضی را بر روی آن انجام داد. چهار عملگر ریاضی در زبان C وجود دارند که در هنگام استفاده از اشاره گرها می توانید از آن ها استفاده کنید ( ++، –، + و -).

برای درک بهتر موضوع اشاره گر ptr را در نظر بگیرید و فرض کنید که به آدرس ۱۰۰۰ در حافظه اشاره می کند. در زبان برنامه نویسی C می توانیم عملیات زیر را بر روی اشاره گر prt اعمال کنیم:

ptr++

زمانی که عملیات بالا انجام شود، اشاره گر ptr ما به آدرس ۱۰۰۴ اشاره می کند به این دلیل که از نوع integer می باشد و هر integer در حافظه ۴ بایت اشغال می کند. حال اگر این اشاره گر از نوع کاراکتر (char) بود، یک واحد به آدرس اضافه می شد (یعنی ۱۰۰۱) زیرا نوع داده کار ۱ بایت از حافظه را اشغال می کند.

افزایش اشاره گر

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

#include <stdio.h>
const int MAX = 3;
int main () {
   int  var[] = {10, 100, 200};
   int  i, *ptr;
   /* let us have array address in pointer */
   ptr = var;
   for ( i = 0; i < MAX; i++) {
      printf("Address of var[%d] = %x\n", i, ptr );
      printf("Value of var[%d] = %d\n", i, *ptr );
      /* move to the next location */
      ptr++;
   }
   return 0;
}

امتحان کنید

زمانی که کد بالا توسط کامپایلر C و اجرا شود، نتیجه زیر را تولید خواهد کرد:

Address of var[0] = bf882b30
Value of var[0] = 10
Address of var[1] = bf882b34
Value of var[1] = 100
Address of var[2] = bf882b38
Value of var[2] = 200

کاهش اشاره گر

روشی که برای افزایش اشاره گر استفاده می شود را می توان برای کاهش آن نیز استفاده کرد با این تفاوت که باید از عملگر کاهشی استفاده شود:

#include <stdio.h>
const int MAX = 3;
int main () 
   int  var[] = {10, 100, 200};
   int  i, *ptr;
   /* let us have array address in pointer */
   ptr = &var[MAX-1];
   for ( i = MAX; i > 0; i--) {
      printf("Address of var[%d] = %x\n", i-1, ptr );
      printf("Value of var[%d] = %d\n", i-1, *ptr );
      /* move to the previous location */
      ptr--;
   }
   return 0;
}

امتحان کنید

زمانی که کد بالا کامپایل و اجرا شود نتیجه زیر را تولید می کند:

Address of var[2] = bfedbcd8
Value of var[2] = 200
Address of var[1] = bfedbcd4
Value of var[1] = 100
Address of var[0] = bfedbcd0
Value of var[0] = 10

مقایسه اشاره گرها

اشاره گرها را می توان با استفاده از عملگر ==، < و > با یک دیگر مقایسه کرد. اگر p1 و  p2 به متغیرهای مرتبط اشاره کنند، بنابراین می توان آن دو را با هم مقایسه کرد. به مثال زیر که تغییر یافته مثال بالاست توجه کنید، آدرس اشاره گر هر بار که حلقه اجرا می شود یک واحد افزایش می یابد و تا زمانی که آدرس قرار گرفته در اشاره گر با آدرس آخرین عنصر آرایه برابر نباشد، اجرای حلقه ادامه پیدا می کند.

#include <stdio.h>
const int MAX = 3;
int main () {
   int  var[] = {10, 100, 200};
   int  i, *ptr;
   /* let us have address of the first element in pointer */
   ptr = var;
   i = 0;
   while ( ptr <= &var[MAX - 1] ) {
      printf("Address of var[%d] = %x\n", i, ptr );
      printf("Value of var[%d] = %d\n", i, *ptr );
      /* point to the previous location */
      ptr++;
      i++;
   }
   return 0;
}

امتحان کنید

زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیرا تولید خواهد کرد:

Address of var[0] = bfdbcb20
Value of var[0] = 10
Address of var[1] = bfdbcb24
Value of var[1] = 100
Address of var[2] = bfdbcb28
Value of var[2] = 200

نوشته اشاره گرهای ریاضی در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
https://sourcesara.com/c-pointer-arithmetic/feed/ 0
اشاره گر ها در زبان C – آموزش زبان C https://sourcesara.com/c-pointers/ https://sourcesara.com/c-pointers/#respond Thu, 20 Sep 2018 05:57:31 +0000 https://sourcesara.com/?p=4143 اشاره گر ها در زبان C اشاره گرها یکی از مباحث آسان و سرگرم کننده زبان برنامه نویسی C برای یادگیری هستند. با استفاده از اشاره گرها انجام برخی از کارها بسیار راحتر می شود. همچنین انجام برخی از کارها نظیر تخصیص حافظه پویا بدون استفاده از اشاره گرها امکان […]

نوشته اشاره گر ها در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
c pointers 4143 اشاره گر ها در زبان C   آموزش زبان C

اشاره گر ها در زبان C

اشاره گرها یکی از مباحث آسان و سرگرم کننده زبان برنامه نویسی C برای یادگیری هستند. با استفاده از اشاره گرها انجام برخی از کارها بسیار راحتر می شود. همچنین انجام برخی از کارها نظیر تخصیص حافظه پویا بدون استفاده از اشاره گرها امکان پذیر نیست. بنابراین یادگیری این مبحث برای تبدیل شدن به یک برنامه نویسی حرفه ای لازم است.

همانطور که می دانید، هر متغیر یک مکان در حافظه است و هر مکان در حافظه دارای آدرسی است که با استفاده از عملگر & می توان به آن آدرس دسترسی داشت. مثال زیر را در نظر بگیرید که آدرس متغیرها را چاپ می کند:

#include <stdio.h>
int main () {
   int  var1;
   char var2[10];
   printf("Address of var1 variable: %x\n", &var1  );
   printf("Address of var2 variable: %x\n", &var2  );
   return 0;
}

امتحان کنید

زمانی که کد بالا توسط کامپایلر C و اجرا شود، نتیجه زیر را تولید خواهد کرد:

Address of var1 variable: bff5a400
Address of var2 variable: bff5a3f6

اشاره گر چیست؟

اشاره گر متغیری است که آدرس متغیر دیگر را در خود ذخیره می کند. منظور از آدرس، محلی از حافظه است که متغیر در آن قرار دارد. مانند سایر متغیرها یا ثابت ها اشاره گرها هم باید قبل از استفاده تعریف شوند. شکل کلی تعریف یک اشاره گر به صورت زیر است:

type *var-name;

در اینجا، type نوع اشاره گر است و باید یکی انواع داده معتبر در زبان C باشد. نام گذاری اشاره گرها از قوانین نام گذاری متغیر پیروی می کند. علامت * همان علامتی است که برای ضرب استفاده می شود اما در اینجا برای تعریف یک اشاره گر استفاده شده است.

چند نمونه از اعلان های معتبر اشاره گر در زبان C:

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

نحوه استفاده از اشاره گرها

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

مثال زیر نحوه استفاده از اشاره گرها را نشان می دهد:

#include <stdio.h>
int main () {
   int  var = 20;   /* actual variable declaration */
   int  *ip;        /* pointer variable declaration */
   ip = &var;  /* store address of var in pointer variable*/
   printf("Address of var variable: %x\n", &var  );
   /* address stored in pointer variable */
   printf("Address stored in ip variable: %x\n", ip );
   /* access the value using the pointer */
   printf("Value of *ip variable: %d\n", *ip );
   return 0;
}

امتحان کنید

زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:

Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20

اشاره گر NULL

همواره یکی از کار های خوب در هنگام استفاده از اشاره گرها، تخصیص مقدار NULL به آن ها می باشد. البته این کار زمانی که درست است که شما هیچ آدرس دقیق و معینی برای تخصیص به اشاره گر خود ندارید. اشاره گری که با NULL مقدار دهی شود، اشاره گر NULL نامیده می شود.

اشاره گر NULL یک ثابت است که در چندین کتابخانه استاندارد زبان C با مقدار صفر مشخص شده است.

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

#include <stdio.h>
int main () {
   int  *ptr = NULL;
   printf("The value of ptr is : %x\n", ptr  );
   return 0;
}

امتحان کنید

زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:

The value of ptr is 0

در اغلب سیستم عامل ها، برنامه ها نمی توانند به آدرس حافظه ۰ دسترسی داشته باشند، زیرا این آدرس توسط سیستم عامل رزرو شده است. با این وجود، آدرس حافظه ۰ اهمیت خاصی دارد؛ این آدرس نشان می دهد که اشاره گر به محلی از حافظه که قابل دسترسی باشد اشاره نمی کند. به طور کلی اگر یک اشاره گر به آدرس حافظه ۰ اشاره کند، می گویند این اشاره گر به هیچ چیزی اشاره نمی کند.

برای چک کردن این که آیا یک اشاره گر به محلی از حافظه اشاره می کند (NULL نیست) یا نه، می توانید به صورت زیر عمل کنید:

if(ptr)     /* succeeds if p is not null */
if(!ptr)    /* succeeds if p is null */

دستور اول NULL نبودن اشاره گر و دستور دوم NULL بودن آن را بررسی می کند.

جزئیات بیشتر در مورد اشاره گرها

مبحث اشاره گرها بسیار بزرگ است اما هر برنامه نویس باید به خوبی با آن آشنا باشد تا بتواند نیاز های خود را برطرف کند. در جدول زیر چند شکل دیگر استفاده از اشاره گرها در زبان C را مشاهده می کنید:

ردیف مفهوم و توضیحات
۱ اشاره گر ریاضی

چهار عملگر ریاضی در زبان C وجود دارد که می توان در هنگام استفاده از اشاره گرها از آن ها استفاده کرد: ++، -، +، –

۲ آرایه ای از اشاره گرها

شما می توانید آرایه ای تعریف کنید که مجموعه ای اشاره گرها را در خود نگه داری کند.

۳ اشاره گر به اشاره گر

در زبان C می توانید اشاره گری تعریف کنید که به یک اشاره گر دیگر اشاره کند.

۴ ارسال اشاره گر با تابع

در زبان برنامه نویسی C شما می توانید یک اشاره گر را به عنوان آرگومان به یک تابع ارسال کنید.

۵ بازگشت اشاره گر از تابع

زبان C به توابع اجازه می دهد تا یک اشاره گر به متغیر محلی، متغیر استاتیک و حافظه اختصاص داده شده به صورت پویا را به عنوان خروجی تابع، بازگشت داده شود.

نوشته اشاره گر ها در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
https://sourcesara.com/c-pointers/feed/ 0
حوزه متغیرها در زبان C – آموزش زبان C https://sourcesara.com/c-scope-rules/ https://sourcesara.com/c-scope-rules/#respond Wed, 19 Sep 2018 19:07:27 +0000 https://sourcesara.com/?p=4064 حوزه متغیرها در زبان C حوزه (Scope) یک منطقه از برنامه می باشد، در کل متغیرها را می توان در سه حوزه زیر تعریف کرد: داخل یک تابع یا یک بلوک (متغیرهای محلی) به عنوان پارامترهای یک تابع (پارامترهای رسمی) خارج از تمام توابع و حوزه ها (متغیرهای سراسری) متغیرهای […]

نوشته حوزه متغیرها در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
c scope rules 4064 حوزه متغیرها در زبان C   آموزش زبان C

حوزه متغیرها در زبان C

حوزه (Scope) یک منطقه از برنامه می باشد، در کل متغیرها را می توان در سه حوزه زیر تعریف کرد:

  • داخل یک تابع یا یک بلوک (متغیرهای محلی)
  • به عنوان پارامترهای یک تابع (پارامترهای رسمی)
  • خارج از تمام توابع و حوزه ها (متغیرهای سراسری)

متغیرهای محلی (Local Variables)

متغیرهایی که در داخل یک تابع یا یک حوزه تعریف شده باشند، به عنوان متغیرهای محلی در نظر گرفته می شوند. این نوع متغیرها فقط می توانند در داخل تابع یا حوزه ای که تعریف شده اند مورد استفاده قرار گیرند.

در مثال زیر متغیرهای a، b و c به عنوان متغیرهای محلی تعریف شده اند:

#include <stdio.h>
int main () {
  /* local variable declaration */
  int a, b;
  int c;
  /* actual initialization */
  a = 10;
  b = 20;
  c = a + b;
  printf ("value of a = %d, b = %d and c = %d\n", a, b, c);
  return 0;
}

امتحان کنید

متغیرهای سراسری (Global Variables)

متغیرهای سراسری خارج از تمام توابع و حوزه، معمولا در بالای برنامه تعریف می شوند. متغیرهای سراسری مقدار خود را تاز مانی که برنامه در حال اجرا باشد، حفظ می کنند. متغیرهای سراسری می توانند در همه توابع و حوزه ها استفاده شوند. به عبارت دیگر، متغیرهای سراسری برای استفاده شدن در کل بخش های برنامه تعریف می شود.

در مثال زیر متغیرهای a و b به عنوان متغیرهای محلی و متغیر g به عنوان متغیر سراسری تعریف شده اند:

#include <stdio.h>
/* global variable declaration */
int g;
int main () {
  /* local variable declaration */
  int a, b;
  /* actual initialization */
  a = 10;
  b = 20;
  g = a + b;
  printf ("value of a = %d, b = %d and g = %d\n", a, b, g);
  return 0;
}

امتحان کنید

در یک برنامه متغیرهای محلی و سراسری می توانند نام مشابهی داشته باشند، اما در داخل یک حوزه یا تابع متغیر محلی بر متغیر سراسری اولویت دارد.

مثلا:

#include <stdio.h>
/* global variable declaration */
int g = 20;
int main () {
  /* local variable declaration */
  int g = 10;
  printf ("value of g = %d\n",  g);
  return 0;
}

امتحان کنید

زمانی که کد بالا توسط کامپایلر زبان C و اجرا شود نتیجه زیر را تولید خواهد کرد:

value of g = 10

پارامترها

پارامترهای یک تابع در حوزه متغیرهای محلی قرار می گیرند و اولویت آن ها از متغیرهای سراسری بیشتر است.

به مثال زیر توجه کنید:

#include <stdio.h>
/* global variable declaration */
int a = 20;
int main () {
  /* local variable declaration in main function */
  int a = 10;
  int b = 20;
  int c = 0;
  printf ("value of a in main() = %d\n",  a);
  c = sum( a, b);
  printf ("value of c in main() = %d\n",  c);
  return 0;
}
/* function to add two integers */
int sum(int a, int b) {
   printf ("value of a in sum() = %d\n",  a);
   printf ("value of b in sum() = %d\n",  b);
   return a + b;
}

امتحان کنید

زمانی که کد بالا کامپایل و اجرا شود، نتیجه زیر را تولید خواهد کرد:

value of a in main() = 10
value of a in sum() = 10
value of b in sum() = 20
value of c in main() = 30

مقداردهی اولیه به متغیرهای محلی و سراسری

هنگام تعریف یک متغیر سراسری اگه به آن مقداری اختصاص نیابد، سیستم به طور خودکار مقدار پیش فرض نوع متغیر را به آن اختصاص می دهد. اما متغیرهای محلی هنگام تعریف شدن توسط سیستم مقداردهی اولیه نمی شوند.

در جدول زیر مقادیر پیش فرض برای انواع داده اصلی در زبان C را مشاهده می کنید:

نوع داده مقدار پیش فرض
int ۰
char ‘\۰’
float ۰
double ۰
pointer NULL

توصیه می شود همیشه مقدار اولیه متغیرها را مشخص کنید، زیرا ممکن است با نتایج غیر منتظره ای در هنگام اجرای برنامه رو به رو شوید. اگر به یک متغیر مقدار اولیه داده نشود، با مقادیر زباله پر خواهد شد.

نوشته حوزه متغیرها در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
https://sourcesara.com/c-scope-rules/feed/ 0
فراخوانی با ارجاع (Call By Reference) در زبان C – آموزش زبان C https://sourcesara.com/call-by-reference-in-c/ https://sourcesara.com/call-by-reference-in-c/#respond Tue, 18 Sep 2018 17:15:12 +0000 https://sourcesara.com/?p=4074 فراخوانی با ارجاع (Call By Reference) در زبان C در فراخوانی با ارجاع (Call By Reference) یک کپی از آدرس آرگومان به تابع ارسال می شود به این معنی که تابع دسترسی مستقیم به مقدار آن آرگومان دارد و هر تغییری که درون تابع اعمال شود بر روی مقدار اصلی […]

نوشته فراخوانی با ارجاع (Call By Reference) در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
call by reference in c 4074 فراخوانی با ارجاع (Call By Reference) در زبان C   آموزش زبان C

فراخوانی با ارجاع (Call By Reference) در زبان C

در فراخوانی با ارجاع (Call By Reference) یک کپی از آدرس آرگومان به تابع ارسال می شود به این معنی که تابع دسترسی مستقیم به مقدار آن آرگومان دارد و هر تغییری که درون تابع اعمال شود بر روی مقدار اصلی نیز تاثیر می گذارد. برای آن که بتوان یک متغیر را به روش اجرا به یک تابع ارسال کرد، پارامتر آن تابع باید به صورت اشاره گر تعریف شود. برای نمونه تابع swap() را در نظر بگیرید:

/* function definition to swap the values */
void swap(int *x, int *y) {
   int temp;
   temp = *x;    /* save the value at address x */
   *x = *y;      /* put y into x */
   *y = temp;    /* put temp into y */
   return;
}

در مثال زیر قصد داریم از طریق فراخوانی با ارجاع (By Reference) مقدار متغیر a و b را با هم عوض کنیم:

#include <stdio.h>
/* function declaration */
void swap(int *x, int *y);
int main () {
   /* local variable definition */
   int a = 100;
   int b = 200;
   printf("Before swap, value of a : %d\n", a );
   printf("Before swap, value of b : %d\n", b );
   /* calling a function to swap the values.
      * &a indicates pointer to a ie. address of variable a and 
      * &b indicates pointer to b ie. address of variable b.
   */
   swap(&a, &b);
   printf("After swap, value of a : %d\n", a );
   printf("After swap, value of b : %d\n", b );
   return 0;
}

امتحان کنید

زمانی که کد بالا توسط کامپایلر زبان C و اجرا شود نتیجه زیر را تولید خواهد کرد:

Before swap, value of a :100
Before swap, value of b :200
After swap, value of a :200
After swap, value of b :100

نتیجه کد بالا به خوبی نشان می دهد که بر خلاف فراخوانی با مقدار، در فراخوانی با ارجاع تغییرات اعمال شده درون تابع بر روی متغیرها تاثیر گذاشته است.

نوشته فراخوانی با ارجاع (Call By Reference) در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
https://sourcesara.com/call-by-reference-in-c/feed/ 0
فراخوانی با مقدار (Call By Value) در زبان C – آموزش زبان C https://sourcesara.com/call-by-value-in-c/ https://sourcesara.com/call-by-value-in-c/#respond Tue, 18 Sep 2018 17:01:42 +0000 https://sourcesara.com/?p=4071 فراخوانی با مقدار (Call By Value) در زبان C در فراخوانی با مقدار (Call By Value) فقط یک کپی از مقدار اصلی به تابع ارسال می شود و تغییرات اعمال شده در تابع تاثیری بر مقدار اصلی ندارد. در زبان C به طور پیشفرض آرگومان ها به صورت فراخوانی با […]

نوشته فراخوانی با مقدار (Call By Value) در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
call by value in c 4071 فراخوانی با مقدار (Call By Value) در زبان C   آموزش زبان C

فراخوانی با مقدار (Call By Value) در زبان C

در فراخوانی با مقدار (Call By Value) فقط یک کپی از مقدار اصلی به تابع ارسال می شود و تغییرات اعمال شده در تابع تاثیری بر مقدار اصلی ندارد. در زبان C به طور پیشفرض آرگومان ها به صورت فراخوانی با مقدار (By Value) به توابع ارسال می شوند. به این معنی که توابع نمی توانند مقادیر اصلی آرگومان ها را تغییر دهند. برای نمونه تابع swap() را در نظر بگیرید:

/* function definition to swap the values */
void swap(int x, int y) {
   int temp;
   temp = x; /* save the value of x */
   x = y;    /* put y into x */
   y = temp; /* put temp into y */
   return;
}

در مثال زیر قصد داریم از طریق فراخوانی با مقدار (By Value) مقدار متغیر a و b را با هم عوض کنیم:

#include <stdio.h> 
/* function declaration */
void swap(int x, int y);
int main () {
   /* local variable definition */
   int a = 100;
   int b = 200;
   printf("Before swap, value of a : %d\n", a );
   printf("Before swap, value of b : %d\n", b );
   /* calling a function to swap the values */
   swap(a, b);
   printf("After swap, value of a : %d\n", a );
   printf("After swap, value of b : %d\n", b );
   return 0;
}

امتحان کنید

زمانی که کد بالا توسط کامپایلر زبان C و اجرا شود نتیجه زیر را تولید خواهد کرد:

Before swap, value of a :100
Before swap, value of b :200
After swap, value of a :100
After swap, value of b :200

اگر به نتیجه مثال بالا توجه کنید، متوجه خواهید شد که با این که ما مقدار متغیرهای a و b را درون تابع swap() تغییر داده ایم، اما مقدار آن ها تغییر نکرده اند.

نوشته فراخوانی با مقدار (Call By Value) در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
https://sourcesara.com/call-by-value-in-c/feed/ 0
توابع در زبان C – آموزش زبان C https://sourcesara.com/c-functions/ https://sourcesara.com/c-functions/#respond Tue, 18 Sep 2018 16:44:38 +0000 https://sourcesara.com/?p=4059 توابع در زبان C یک تابع گروهی از دستورات است که با هم یک کار را انجام می دهند. هر برنامه ای که با زبان برنامه نویسی C نوشته می شود، حتما باید یک تابع اصلی به نام تابع main() را داشته باشد. شما می توانید کدهای خود را به […]

نوشته توابع در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
c functions 4059 توابع در زبان C   آموزش زبان C

توابع در زبان C

یک تابع گروهی از دستورات است که با هم یک کار را انجام می دهند. هر برنامه ای که با زبان برنامه نویسی C نوشته می شود، حتما باید یک تابع اصلی به نام تابع main() را داشته باشد. شما می توانید کدهای خود را به توابع مختلف تقسیم کنید و نحوه تقسیم کدها نیز بستگی به خود شما دارد. اما منطق تقسیم کد این است که هر تابع یک کار خاص را انجام دهد. اعلان یک تابع، اطلاعات لازم در مورد تابع (مانند اسم تابع، مقدار بازگشتی و پارامترهای تابع) را به کامپایلر می دهد.

کتابخانه استاندارد C توابع پیش ساخته متعددی را فراهم می کند که می توانید در برنامه های خود از آن ها استفاده کنید. برای نمونه تابع strcat() برای چسباندن دو رشته به یک دیگر استفاده می شود.

تعریف یک تابع

شکل کلی تعریف یک تابع در زبان C به صورت زیر است:

return_type function_name( parameter list ) {
   body of the function
}

تعریف یک تابع شامل یک بخش هدر و یک بخش بدنه می شود. قسمت های مختلف یک تابع در زیر توضیح داده شده است:

  • return_type : نوع داده ای است که تابع قرار است بعد از اتمام کارش باز گرداند. اگر تابع هیچ مقداری را بر نمی گرداند، می توانید آن را به صورت void تعریف کنید.
  • funcation_name : اسم تابع را مشخص می کند. اسم تابع به همراه لیست پارامترها امضای یک تابع را تشکیل می دهند.
  • parameter list : پارامترهای یک تابع را مشخص می کند. یک پارامتر مانند یک placeholder عمل می کند و زمانی که شما تابع را فراخوانی می کنید، باید مقدار پارامترهای تعریف شده را نیز به آن بدهید. همچنین یک تابع می تواند بدون پارامتر تعریف شود.
  • body of the function : بدنه تابع را مشخص می کند. بدنه تابع شامل مجموعه ای از دستورات است که عملی که تابع انجام می دهد را تعریف می کنند.

مثال

در زیر سورس کد مربوط به یک تابع که max() نام دارد را مشاهده می کنید. این تابع دو پارامتر با نام های num1 و num2 می گیرد و هر کدام که از دیگری بزرگتر باشد را به عنوان مقدار بازگشتی باز می گرداند.:

/* function returning the max between two numbers */
int max(int num1, int num2) {
   /* local variable declaration */
   int result;
   if (num1 > num2)
      result = num1;
   else
      result = num2;
   return result; 
}

اعلان یک تابع

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

اعلان یک تابع به صورت زیر انجام می شود:

return_type function_name( parameter list );

برای مثال، اعلان تابع max() که در مثال بالا به آن پرداختیم، به صورت زیر است:

int max(int num1, int num2);

 

توجه! نام پارامترها در اعلان یک تابع مهم نیستند و فقط نوع آن ها اهمیت دارد. بنابراین می توان اعلان بالا را به این صورت نیز نوشت:

int max(int, int);

اعلان تابع زمانی که شما تعریف تابع را در یک فایل دیگر نوشته اید، لازم است.

فراخوانی یک تابع

زمانی که یک تابع را فراخوانی می کنید، کنترل اجرای برنامه به آن تابع منتقل می شود و دستورات موجود در تابع را اجرا می کند و پس از پایان اجرای دستورات، کنترل اجرای برنامه به محل قبلی خود باز میگردد. شما به راحتی می توانید با نوشتن اسم تابع و دادن پارامترهای لازم آن را فراخوانی کنید. مثال زیر نحوه فراخوانی تابع در زبان C را نشان می دهد:

#include <stdio.h>
/* function declaration */
int max(int num1, int num2);
int main () {
   /* local variable definition */
   int a = 100;
   int b = 200;
   int ret;
   /* calling a function to get max value */
   ret = max(a, b);
   printf( "Max value is : %d\n", ret );
   return 0;
}
/* function returning the max between two numbers */
int max(int num1, int num2) {
   /* local variable declaration */
   int result;
   if (num1 > num2)
      result = num1;
   else
      result = num2;
   return result; 
}

امتحان کنید

زمانی که کد بالا توسط کامپایلر زبان C و اجرا شود نتیجه زیر را تولید خواهد کرد:

Max value is : 200

آرگومان های تابع

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

ردیف توضیحات
۱ فراخوانی با مقدار (Call By Value)

در این نوع فراخوانی فقط یک کپی از مقدار اصلی به تابع ارسال می شود و تغییرات اعمال شده در تابع تاثیری بر مقدار اصلی ندارد.

۲ فراخوانی با ارجاع (Call By Reference)

در این نوع فراخوانی یک کپی از آدرس آرگومان به تابع ارسال می شود به این معنی که تابع دسترسی مستقیم به مقدار آن آرگومان دارد و هر تغییری که درون تابع اعمال شود بر روی مقدار اصلی نیز تاثیر می گذارد.

توجه! در زبان C به طور پیشفرض آرگومان ها به صورت فراخوانی با مقدار (By Value) به توابع ارسال می شوند. به این معنی که توابع نمی توانند مقادیر اصلی آرگومان ها را تغییر دهند.

نوشته توابع در زبان C – آموزش زبان C اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

]]>
https://sourcesara.com/c-functions/feed/ 0