العجيب اني مس انتبهت للموضوع ده خير من كام يوم لما كنت براجع مع نفسي
لحد ماقعدت افكر فيها كده بهداوه مع نفسي
علي فكره عشان تفهم الدرس ده لازم تفهم ان ال Pointer مش مجرد متغير بيحفظ العنوان بتاع متغير d تاني وخلاص
لا هي بتحفظ العناوين بس مش شرط تكون عنووين متغيرات
يعني من النهايه pointer to a functions تعني ان هذا المؤشر يشير الي the address of this function العنوان بتاعها
بدره انت تفكر هي لزمتها ايه
الصراحه انا من راي انها مهمه لبتوع ال GUIS
لانها بتخدل مع ال functions arguments عشان تحدد احداث معينه ده مجرد مثال
طريقه تعيين مؤشر لداله
ده مثال لمؤشر لداله بتاخد argument واحده بس الي هي int f
تسال نفسك دلوقتي طيب مانت قولت انها بتخزن عنوان الداله هي فين الداله الي حتخزن عنوانها
بسيطه شوف ده كده
لاحظ تلات حاجات
واحد ال function من نوع void
وكمان بتاخد pointer from type char as argument
لاحظ كمان ان ال pointer to functions is local to main
يعني داخلي في الmain بس
يعني كده مثلا مش ينفع
حيقولك ان ss is not defined
لكن كده ممكن
لاحظ انك استديعت ss في ff واديتلها العنوان بتاع function جوه ff واستخدمتها
سيبك بقي من كل ده وتاعلي للمثال الجميل ده من موقع cprogramming.com
هنا بقي حتوضح كل حاجه
لان هنا انت استخدمت ال
عشان يحدد نوع ال
الي انت عايزه
لاحظ انه من المفروض انها ترجع -1 لما يكون الثاني اكبر من الاول او 0 لما يكونوا الاتنين زي بعض او 1 لما يكون الاول اكبر من التاني
لاحظ
خد اول قيمه في اول argument وحطها في first
وعمل نفس الكلام مع تاني قيمه
وعمل الاتي
جميل الكلام
هنا خد اول عنصر في المصفوفه وخد اخر عنصر فيها او لحد مانت عايز ترتب العناصر
وخد الحجم بتاع ال int عشان انت بترتب مصفوفه رقميه من نوع int وخد طريقة الترتيب الي هي pointer to function
فيه كمان نقطه جميله جدا هنا
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
المفروض انك تكون عارف ان void *ptr;
مؤشر لكل الانواع الي انت ممكن تحتجها يعني كل الي عليك تعمل type casting
int(*compar)(const void *, const void *)
ديت الي هي مؤشر للداله الي انت حتمررها لل qsort
مراجع:
في حاجات في ال call backs بس انا مش فاضي
c u all
لحد ماقعدت افكر فيها كده بهداوه مع نفسي
علي فكره عشان تفهم الدرس ده لازم تفهم ان ال Pointer مش مجرد متغير بيحفظ العنوان بتاع متغير d تاني وخلاص
لا هي بتحفظ العناوين بس مش شرط تكون عنووين متغيرات
يعني من النهايه pointer to a functions تعني ان هذا المؤشر يشير الي the address of this function العنوان بتاعها
بدره انت تفكر هي لزمتها ايه
الصراحه انا من راي انها مهمه لبتوع ال GUIS
لانها بتخدل مع ال functions arguments عشان تحدد احداث معينه ده مجرد مثال
طريقه تعيين مؤشر لداله
كود PHP:
void (*pointer_to_a_function)(int f);
تسال نفسك دلوقتي طيب مانت قولت انها بتخزن عنوان الداله هي فين الداله الي حتخزن عنوانها
بسيطه شوف ده كده
كود PHP:
#include<stdio.h>
void function(char *x)
{
printf("%s\n",x);
}
int main(int argc,char **argv)
{
void (*ss)(char *x);
function(argv[1]);
ss=function;
ss(argv[1]);
}
واحد ال function من نوع void
وكمان بتاخد pointer from type char as argument
لاحظ كمان ان ال pointer to functions is local to main
يعني داخلي في الmain بس
يعني كده مثلا مش ينفع
كود PHP:
#include<stdio.h>
void function(char *x)
{
printf("%s\n",x);
}
void ff(char *ff)
{
ss(ff);
}
int main(int argc,char **argv)
{
void (*ss)(char *x);
function(argv[1]);
ss=function;
ss(argv[1]);
}
لكن كده ممكن
كود PHP:
#include<stdio.h>
voi(*ss)(char *x);
void function(char *x)
{
printf("%s\n",x);
}
void ff(char *ff)
{
ss=function;
ss(ff);
}
int main(int argc,char **argv)
{
function(argv[1]);
ff(argv[1]);
ss(argv[1]);
}
سيبك بقي من كل ده وتاعلي للمثال الجميل ده من موقع cprogramming.com
كود PHP:
#include <stdlib.h>
int int_sorter( const void *first_arg, const void *second_arg )
{
int first = *(int*)first_arg;
int second = *(int*)second_arg;
if ( first < second )
{
return -1;
}
else if ( first == second )
{
return 0;
}
else
{
return 1;
}
}
int main()
{
int array[10];
int i;
/* fill array */
for ( i = 0; i < 10; ++i )
{
array[ i ] = 10 - i;
}
qsort( array, 10 , sizeof( int ), int_sorter );
for ( i = 0; i < 10; ++i )
{
printf ( "%d\n" ,array[ i ] );
}
}
لان هنا انت استخدمت ال
كود PHP:
sorter
كود PHP:
sorting
لاحظ انه من المفروض انها ترجع -1 لما يكون الثاني اكبر من الاول او 0 لما يكونوا الاتنين زي بعض او 1 لما يكون الاول اكبر من التاني
كود PHP:
int first = *(int*)first_arg;
int second = *(int*)second_arg;
if ( first < second )
{
return -1;
}
else if ( first == second )
{
return 0;
}
else
{
return 1;
}
خد اول قيمه في اول argument وحطها في first
وعمل نفس الكلام مع تاني قيمه
وعمل الاتي
ترجع -1 لما يكون الثاني اكبر من الاول او 0 لما يكونوا الاتنين زي بعض او 1 لما يكون الاول اكبر من التاني
كود PHP:
qsort( array, 10 , sizeof( int ), int_sorter );
وخد الحجم بتاع ال int عشان انت بترتب مصفوفه رقميه من نوع int وخد طريقة الترتيب الي هي pointer to function
فيه كمان نقطه جميله جدا هنا
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
المفروض انك تكون عارف ان void *ptr;
مؤشر لكل الانواع الي انت ممكن تحتجها يعني كل الي عليك تعمل type casting
int(*compar)(const void *, const void *)
ديت الي هي مؤشر للداله الي انت حتمررها لل qsort
مراجع:
في حاجات في ال call backs بس انا مش فاضي

c u all
تعليق