1. 程式人生 > >函式指標,函式指標陣列的學習

函式指標,函式指標陣列的學習

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//函式指標的學習
//11_4_1
//11_4-2

//void test()
//{
// printf(“hehe\n”);
//}
//int add(int a, int b)
//{
// return a + b;
//}
//int main()
//{
// int (*p)(int, int) = &add;
// //int(*p)[10] = &arr;
// printf("%d\n", (*add)(1, 2));
// system(“pause”);
//}
//int main()
//{
// //printf("%p\n", &test);
// //(*test)();
// //test();
// printf("%d\n", (*add)(2, 3));
// system(“pause”);
// return 0;
//}

//((void()())0)()
//呼叫0地址處的無參返回型別是void的函式

//void(signai(int, void()(int)))(int)
//signal是一個函式的宣告
//函式的引數有兩個,該指標指向的函式有一個引數,型別為int,函式的返回型別為void
//signal函式的返回型別為函式指標
//該指標指向的函式有一個引數,型別為int,函式的返回型別為void

//int(arr[10])();
//函式指標陣列
//arr先和[]結合,所以它是陣列,去掉arr[10],剩下的int(
)()是函式指標,這個指標指向的函式沒有引數,返回型別是int

//void menu()
//{
// printf("*********************************************\n");
// printf("********* 1.add 2.sub \n");
// printf("

3.mul 4.div \n");
// printf("
0.exit \n");
// printf("
*********************************\n");
//}
//int Add(int x, int y)
//{
// return x + y;
//}
//int Sub(int x, int y)
//{
// return x - y;
//}
//int Mul(int x, int y)
//{
// return x * y;
//}
//int Div(int x, int y)
//{
// return x / y;
//}
//int main()
//{
// int input = 0;
// int x = 0;
// int y = 0;
// int ret = 0;
// do
// {
// menu();
// printf(“請選擇:>”);
// scanf("%d", input);
// if (input >= 1 && input <= 4)
// {
// printf(“請輸入兩個運算元:>”);
// scanf("%d%d",&x,&y);
// }
// switch (input)
// {
// case 1:
// ret = Add(x, y);
// break;
// case 2:
// ret = Sub(x, y);
// break;
// case 3:
// ret = Mul(x, y);
// break;
// case 4:
// ret = Div(x,y);
// break;
// case 0:
// printf(“退出\n”);
// break;
// default:
// printf(“輸入錯誤\n”);
// break;
// }
// printf("%d\n", ret);
// } while (input);
// system(“pause”);
// return 0;
//}

//改造後
//轉移表
//int main()
//{
// int input = 0;
// int x = 0;
// int y = 0;
// int ret = 0;
// int(*pfun[5])(int, int) = {0, Add, Sub, Mul, Div};//利用函式指標陣列提高程式碼的效率,減少了程式碼量
// do
// {
// menu();
// printf(“請選擇:>”);
// scanf("%d", input);
// if (input >= 1 && input <= 4)
// {
// printf(“請輸入兩個運算元:>”);
// scanf("%d%d",&x,&y);
// ret = pfun[input](x, y);
// printf("%d\n", ret);
// }
// } while (input);
// system(“pause”);
// return 0;
//}

//利用函式指標不斷地提高程式碼的效率
//提高程式碼的可讀性

//enum option //利用列舉
//{
// EXIT,//0
// ADD,//1
// SUB,//2
// MUI,//3
// DIV//4
//
//};
//void Calc(int(pfun)(int, int))
//{
// int x = 0;
// int y = 0;
// int ret = 0;
// printf(“請輸入兩個運算元:”);
// ret = pfun(x, y);
// printf("%d\n", ret);
//
//}
//int main()
//{
// int input = 0;
// int x = 0;
// int y = 0;
// int ret = 0;
// do
// {
// menu();
// printf(“請選擇:>”);
// scanf("%d", input);
// if (input >= 1 && input <= 4)
// {
// printf(“請輸入兩個運算元:>”);
// scanf("%d%d",&x,&y);
// }
// switch (input)
// {
// case ADD: //利用列舉,從這就可以看到函式呼叫的函式,更直觀一些
// Calc(Add); //f防止出錯
// break;
// case SUB:
// Calc(Sub);
// break;
// case MUI:
// Calc(Mul);
// break;
// case DIV:
// Calc(Div);;
// break;
// case EXIT:
// printf(“退出\n”);
// break;
// default:
// printf(“輸入錯誤\n”);
// break;
// }
//
// } while (input);
// system(“pause”);
// return 0;
//}
//char
my_strcpy(chardst, const charsrc)
//{
// //…
//}
//int main()
//{
// int arr[6] = { 0 };
// int (parr)[6] = &arr;//parr陣列指標
// char
(pfun)(char, const char*) = my_strcpy;
// return 0;
//}

//int ADD(int x, int y)
//{
// return x + y;
//}
//int SUB(int x, int y)
//{
// return x - y;
//}
//chartest1(int a, intb)
//{
//
//}
//chartest2(int a, intb)
//{
//
//}
//int main()
//{
// char*(pfun)(int,int) = test1; //函式指標
// char*(pfun[2])(int,int) = { test1, test2 }; //函式指標陣列
// char*((pfun)[2])(int , int) = &pfun; //指向函式指標陣列的指標
//
// //int(pfun[2])(int, int) = { ADD, SUB };
// //int(
(*p)[2])(int,int) = &pfun;
// return 0;
//}

//回撥函式
//qsort函式

//void qsort(void base, size_t num, size_t width,
// int(__cdecl compare)(const void eleml,const void elem2))
//
//__cdecl–函式的呼叫約定
//
//void bubble_sort(int
arr,int sz)
//{
// int i = 0;
// //趟數
// for (i = 0; i < sz-1; i++)
// {
// //每一趟的比較
// int j = 0;
// for (j = 0; j < sz - 1 - i; j++)
// {
// int tmp = 0;
// if (arr[j]>arr[j + 1])
// {
// tmp = arr[j + 1];
// arr[j] = arr[j + 1];
// arr[j] = tmp;
// }
// }
// printf("\n");
// }
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
//}
//int main()
//{
// int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// bubble_sort(arr,sz);
// system(“pause”);
// //size_t 無符號整型
//
// return 0;
//}
//
//int cmp_int(const void
e1, const void
e2)
//{
// return (int)e1 - (int)e2;
//}
//
//struct Stu
//{
// char name[20];
// int age;
//};
//
//int cmp_stu_by_age(const void
e1, const voide2)
//{
// return ((struct Stu
)e1)->age - ((struct Stu*)e2-)>age);
//}
//int cmp_stu_by_name(const voide1, const voide2)
//{
// return strcmp(((struct Stu*)e1)->name ,( (struct Stu*)e2)->name);
//}
//void test1()
//{
// struct Stu s[3] = { {“zhangsan”,20}, {“lisi”,10}, {“wangwu”,15} };
// int sz = sizeof(s) / sizeof(s[0]);
// qsort(s, sz, sizeof(s[0], cmp_stu_by_age));
//}
//
//void test2()
//{
// int a = 10;
// void* p = &a; //void就像一個垃圾桶,可以接收其他型別的傳遞
// int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// qsort(arr, sz, sizeof(arr[0]), cmp_int);
//}
//void Swap(charbuf1, charbuf2, int width)
//{
// int i = 0;
// for (i = 0; i < width; i++)
// {
// char tmp = buf1;
// buf1 = buf2;
// buf2 = tmp;
// buf1++;
// buf2++;
// }
//}
//void bubble_sort(void
base,int sz,int width,int(cmp)(const voide1,const void
e2) ) //用qsort實現氣泡排序
//{
// int i = 0;
// int j = 0;
// for (i = 0; i < sz - 1; i++)
// {
// for (j = 0; j < sz - 1 - i; j++)
// {
// if ((cmp((char
)base + j
width, (char*)base + (j + 1)width))>0)
// {
// Swap((char
)base + jwidth, (char)base + (j + 1)*width,width);
// }
// }
// }
//}
//int main()
//{
// //sizeof(陣列名)
// //&陣列名 只有這兩種情況代表的是整個陣列
// int a[] = { 1, 2, 3, 4 };
// printf("%d\n", sizeof(a)); //求陣列大小(即位元組)16
// printf("%d\n", sizeof(a + 0)); //首元素地址+0(即首元素的地址)4
// printf("%d\n", sizeof(a)); //4
// printf("%d\n", sizeof(a + 1)); //4
// printf("%d\n", sizeof(a[1])); //4
// printf("%d\n", sizeof(&a)); //陣列的地址 4
// printf("%d\n", sizeof(
&a)); //16 注意這個和上一個的區別
// printf("%d\n", sizeof(&a + 1));//4 跳過整個陣列
// printf("%d\n", sizeof(&a[0])); //4
// printf("%d\n", sizeof(&a[0] + 1));//4 即第二個元素的地址
//}