天天看點

指針進階4

#define _CRT_SECURE_NO_WARNINGS 1
  //實列2:分析以下代碼
//代碼1
  //(*(viod(*)())0)();
//解釋如下:
// 現有一個數為:0,将0的類型強制轉化為void(*)()的函數指針類型:(void(*)())0,調用0這個位址處的該函數(*(void(*)())0)()
  //代碼2
  //void (*signa1(int, void(*)(int)))(int);
  // 
//解釋如下:
// 1.整體解釋
//有一個名為signa1(int, void(*)(int))的函數指針,元素類型為int,傳回值為void.
// 2.函數指針名解釋:
// 有一個名為signal的函數,元素類型為int和void(*)(int)(函數指針類型)
// 簡寫:
//typedef void(*pfun_t)(int);
//pfun_t signal(int,pfun_t);
//解釋如下:
//将void(*)(int)傳回值為void的函數指針類型且元素類型為int的函數指針類型通過typedef對整體重新命名為pfun_t:typedef void(*pfun_t)(int);
//用通過typedef整體重新命名為pfun_t的函數指針類型,帶入函數名為signal的函數且函數的元素類型為int和通過typedef整體重新命名為pfun_t的函數指針類型;
//#include<stdio.h>
//int ADD(int z, int y)
//{
//  return z + y;
//}
//int main()
//{
//  int (*pa)(int, int) = ADD;
//  printf("%d\n", (pa)(2, 3));
//  printf("%d\n", (*pa)(2, 3));//"*"作用不大可省略,若要用必須加上“()”
//  return 0;
//}
// 
// 
//函數指針數組
//列題1:
//#include<stdio.h>
//int ADD(int z, int y)
//{
//  return z + y;
//}
//#include<stdio.h>
//int SUB(int z, int y)
//{
//  return z -y;
//}
//#include<stdio.h>
//int MUL(int z, int y)
//{
//  return z * y;
//}
//#include<stdio.h>
//int DIV(int z, int y)
//{
//  return z / y;
//}
//int main()
//{
//  //指針數組
//  int* arr[5];
//  //pa存放的是一個函數指針
//  int (*pa)(int, int) = ADD;
////函數指針數組:若需要存放多個函數指針既要用到數組形式如下
//  //注意:數組是存放相同類型資料的存儲空間;
//  int(*parr[4])(int, int)={ADD,SUB,MUL,DIV};//函數指針數組
//  int i = 0;
//  for(i = 0; i < 4; i++)
//  {
//    printf("%d\n", parr[i](2, 3));
//  }
//  return 0;
//}
//列題2:
//char* my_strcpy(char* dest, const char* src);
////1.通過上面函數寫一個函數指針pf,能夠指向my_strcpy;
//
////2.寫一個函數指針數組,能夠存放四個my_strcpy函數的位址;
//#include<stdio.h>
//int main()
//{
//  //1.答
//  char* (*pf)(char*,const char*) = my_strcpy;
//  //2.答
//  char* (*pfArr[4])(char*, const char*) = { my_strcpy,my_strcpy,my_strcpy,my_strcpy };
//  return 0;
//}
//列題3:函數指針數組的用途:轉移表
//列子:計算機
//1.普通輸出
//#include<stdio.h>
//
//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;
//}
//void menu()
//{
//  printf("***************************\n");
//  printf("*****1.ADD*******2.SUB*****\n");
//  printf("*****3.DIV*******4.MUL*****\n");
//  printf("***********0.退出**********\n");
//  printf("***************************\n");
//}
//int main()
//{
//  int input = 0;
//  int x, y;
//  do {
//    menu();
//    printf("請輸入資料:\n");
//    scanf("%d", &input);
//    switch (input)
//    {
//      case 1:
//        printf("請輸入兩個資料:\n");
//        scanf("%d%d", &x, &y);
//      printf("%d\n",ADD(x,y));
//      break;
//      case 2:
//        printf("請輸入兩個資料:\n");
//        scanf("%d%d", &x, &y);
//      printf("%d\n", SUB(x, y));
//      break;
//      case 3:
//        printf("請輸入兩個資料:\n");
//        scanf("%d%d", &x, &y);
//      printf("%d\n", MUL(x, y));
//      break;
//      case 4:
//        printf("請輸入兩個資料:\n");
//        scanf("%d%d", &x, &y);
//      printf("%d\n", DIV(x, y));
//      break;
//      case 0:
//      printf("退出\n");
//      break;
//      default:
//        printf("輸入錯誤,請重新輸入:");
//          break;
//    }
//  } while (input);
//  return 0;
//}
//2.利用函數指針數組的形式解決:
//#include<stdio.h>
//
//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;
//}
//void menu()
//{
//  printf("***************************\n");
//  printf("*****1.ADD*******2.SUB*****\n");
//  printf("*****3.DIV*******4.MUL*****\n");
//  printf("***********0.退出**********\n");
//  printf("***************************\n");
//}
//int main()
//{
//  int input=0,x=0,y=0;
//  int (*pfARR[5])(int, int) = { 0,ADD,SUB,MUL,DIV};//這樣的函數指針數組被稱為轉移表
//  do
//  {
//    menu();
//    printf("請輸入選擇:\n");
//    scanf("%d", &input);
//    if (input >= 1&&input <= 4)
//    {
//      
//      printf("請輸入兩個資料:\n");
//      scanf("%d%d", &x, &y);
//      printf("%d\n", (*pfARR[input])(x, y));
//    }
//    else if (input == 0)
//    {
//      printf("退出\n");
//    }
//    else
//      printf("輸入錯誤請從新輸入:");
//  } while (input);
//  return 0;
//}

//3.回調函數;觀察可知case:以下的多條語句形式一緻則可建立一個函數進行回調
//回調函數就是一個通過函數指針調用的函數.如果你把函數的指針(位址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,
// 我們說它就是回調函數。回調函數不是有函數的實作方直接調用,而是在特定的事件或者條件時由;另外的一方調用的。用于對該事件或條件進行響應;
// (1)列1:
//#include<stdio.h>
//
//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;
//}
//void menu()
//{
//  printf("***************************\n");
//  printf("*****1.ADD*******2.SUB*****\n");
//  printf("*****3.DIV*******4.MUL*****\n");
//  printf("***********0.退出**********\n");
//  printf("***************************\n");
//}
//void Cale(int (*pf)(int, int))//回調函數
//{
//  int x = 0, y = 0;
//  printf("請輸入兩個資料:\n");
//  scanf("%d%d", &x, &y);
//  printf("%d\n", (*pf)(x, y));
//}
//int main()
//{
//  int input = 0;
//  int x, y;
//  do {
//    menu();
//    printf("請輸入資料:\n");
//    scanf("%d", &input);
//    switch (input)
//    {
//      case 1:
//        Cale(ADD);
//      break;
//      case 2:
//        Cale(SUB);
//      break;
//      case 3:
//        Cale(MUL);
//      break;
//      case 4:
//        Cale(DIV);
//      break;
//      case 0:
//      printf("退出\n");
//      break;
//      default:
//        printf("輸入錯誤,請重新輸入:");
//          break;
//    }
//  } while (input);
//  return 0;
//}
// (2)列2:冒泡排序
//1>普通冒泡排序
//了解qosort
#include<stdio.h>
void sort(int arr[], int M)
{
  int i, iTemp;
  for (i = 0; i < M - 1; i++)
  {
    int j;
    int DUI = 1;
    for (j = 0; j < M - i - 1; j++)
    {
      if (arr[j] > arr[j + 1])
      {
        iTemp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = iTemp;
        DUI = 0;
      }
    }
    if (DUI == 1)
    {
      break;
    }
  }
}
int main()
{
  int arr[] = { 3,4,1,2,6,5,8,7,9,10 };
  int sz = sizeof(arr) / sizeof(arr[0]);

  sort(arr, sz);
  for (int i = 0; i < sz; i++)
  {
    printf(" %d ", arr[i]);
  }
  return 0;
}

//4.指向函數指針數組的指針
//#include<stdio.h>
//int ADD(int x, int y)
//{
//  return x + y;
//}
//int main()
//{
//  int arr[10] = { 0 };
//  int(*p)[10] = &arr;//指向數組指針的指針
//
//  int(*pf)(int, int) = &ADD;//指向函數指針的指針
//  int (*pfArr[4])(int, int)={ADD,ADD,ADD,ADD};//函數指針數組
//  int * (*ppfArr[4])(int, int) = &pfArr;//指向函數指針數組的指針
//
//  return 0;
//}