1. 程式人生 > >C++——指針---指向數組的指針---指向字符串的指針--指向函數的指針--指針的指針--指針的引用

C++——指針---指向數組的指針---指向字符串的指針--指向函數的指針--指針的指針--指針的引用

編號 函數名 員工 dig 圖片 string gin bsp 技術分享

一、指向數組的指針

  • 代碼示例1:
    • 1 int main()
      2 {
      3     int a[10]={0,2,4,6,8,10,12,14,16,18};
      4     int *p;
      5     for(p=&a[0];p<&a[0]+10;p++)
      6         printf("%d ",*p);
      7 }
  • 代碼示例2:
    • int a[10]={0,2,4,6,8,10,12,14,16,18};
      int *p;
      p=a;
      printf("%d\n",*(a+5));//註意加括號,否則就是輸出“a指向的值加5”了
      
      
      int sum(int *a,int n)
      {
          
      int ans=0; for(int i=1;i<=n;i++) ans+=a[i]; return ans; }



二、指向字符串的指針

  • 示例代碼:
    • 1 char *pstr=”C++ is a object_oriented language”; 
      2 cout<<pstr<<endl;//直接打印整個字符串而不是字符串第一個字母的地址
      3 //將字符串常量的第一個字符的地址賦給指針。字符串常量存儲在字符串常量區。
      4 //區分指針常量與常量指針。這裏是一個常量指針,即指針指針指向的內容不可以改變,但指針本身可以改變,可以指向其他變量。




三、指向函數的指針

  1、指向函數的指針:

一個函數的函數名就是一個指針,它指向函數的代碼。一個函數的地址就是該函數的進入點。函數的調用可以通過函數名,也可以通過指向函數的指針來調用。

  2、指向函數的指針的定義:

  • int (*p)(int i,int j);//p是一個指針,他指向一個函數,該函數有兩個整形參數,返回值為int類型。p首先與*結合,表明p是一個指針。然後再與()結合,表明這個指針指向的是一個函數。指向函數的指針也稱為函數指針。
  • 需要與返回值是指針的函數進行區別:int *fun(int i,intj);
  • 函數指針需要將一個函數的地址賦給它,有以下兩種寫法:
    • int
      (*fun)(int x,int y); fun=&Function; fun=Function;//這裏取地址運算符&不是必須的,因為函數名本身就表示函數的地址。
  • 函數指針的調用:
    • x=(*fun)();
      x=fun();
      //兩種調用方式都可以,盡量使用第一種調用方式,因為可以清楚地指明這時通過指針的方式來調用函數。

  • 指向函數的指針的應用:1:菜單選擇的實現(通過函數指針的數組) 2:函數指針作為函數的參數
    • 函數指針的數組:菜單選擇的實現
      • 在一個工資管理系統中有如下功能:1.添加員工。2.刪除員工。3.修改員工信息。4.打印工資單。5.打印匯總表。6.退出。設計中一般把每個功能設計成一個函數。如add,delete,modify,printslary,printreport。主程序是一個循環,顯示所有功能和他的編號。根據輸入的編號調用相應的函數。
      • 代碼1:不使用函數指針實現時:
        •  1 int main()
           2 { int select;
           3   while(1) {     
           4    cout << "1--add \n";
           5    cout << "2--delete\n";
           6    cout << "3--modify\n";
           7    cout << "4--print salary\n";
           8    cout << "5--print report\n";
           9    cout << "0--quit\n";
          10    cin >> select;
          11 
          12   switch(select) 
          13   {
          14   case 0: return 0;
          15   case 1: add(); break;
          16   case 2: erase(); break;
          17   case 3: modify(); break;
          18   case 4: printSalary(); break;
          19   case 5: printReport(); break;
          20   default: cout << "input error\n";
          21   }
          22  }
          23 }

          代碼太長,如果功能有一萬個就要寫很長。

      • 代碼2:使用函數指針實現:
        •  1 int main()
           2 { int select;
           3   void (*func[6])() = {NULL, add, erase, modify, printSalary, printReport};//定義函數指針的數組,註意寫法!
           4   while(1) { 
           5   cout << "1--add \n";
           6   cout << "2--delete\n";
           7   cout << "3--modify\n";
           8   cout << "4--print salary\n";
           9   cout << "5--print report\n";
          10   cout << "0--quit\n";
          11   cin >> select;
          12   if (select == 0) return 0;
          13   if (select > 5) 
          14   cout << "input error\n"; 
          15   else func[select]();
          16     }
          17 }

          代碼第3行定義了一個函數指針的數組。

    • 函數指針作為函數參數:
      • 設計一個通用的冒泡排序函數,可以排序任何類型的數據。如何表示要排序的數據:將快速排序設計成一個函數模板,將待排序的數據類型設計成模板參數,不同的數據類型有不同的比較方式:向排序函數傳遞一個比較函數來解決。
      • 代碼示例1:冒泡排序:
        •  1 void sort(int a[], int size)
           2 {   bool flag;//用於冒泡中提前結束冒泡
           3     int i, j;
           4     for (i = 1; i < size; ++i) {
           5         flag = false;
           6         for (j = 0; j <size - i; ++j)   
           7         if (a[j+1] < a[j])  {   
           8            int tmp = a[j];
           9            a[j] = a[j+1];
          10            a[j+1] = tmp;
          11            flag = true;
          12         }
          13            if (!flag) break;    
          14     }
          15 }
          上述代碼的缺點是只能用於整形數的排序,現在寫一個可以適用於任意類型不符合排序規則的,並把排序規則寫在函數裏邊。
      • 示例代碼2:適合任意類型的排序函數,不符合排序規則的寫在排序規則裏
        •  1 template <class T>//使用函數模板
           2 void sort(T a[], int size, bool (*f)(T,T))
           3 bool flag;//用於冒泡中提前結束冒泡
           4 int i, j;
           5 for (i = 1; i < size; ++i) {
           6         flag = false;
           7         for (j = 0; j <size - i; ++j)   
           8         if (f(a[j+1],a[j]))  //用函數f(T,T)來表示排序規則
           9         {   
          10            int tmp = a[j];
          11            a[j] = a[j+1];
          12            a[j+1] = tmp;
          13            flag = true;
          14         }
          15            if (!flag) break;    
          16     }
          17 }
          18 //排序規則
          19 bool decreaseInt(int x, int y) {return y<x;}
          20 bool increaseString(char *x, char *y)  {return strcmp(x,y)<0;}
          21 int main()
          22 {
          23        int a[] = {3,1,4,2,5,8,6,7,0,9}, i;
          24        char *b[]= {"aaa","bbb","fff","ttt","hhh","ddd","ggg","www","rrr","vvv"};
          25  
          26        sort(a, 10,  decreaseInt);
          27        for ( i = 0; i < 10; ++i) cout << a[i] << "\t";
          28        cout << endl;  
          29  
          30             sort(b, 10, increaseString );
          31        for (i = 0; i < 10; ++i) cout << b[i] << "\t";
          32        cout << endl;
          33 
          34       return 0;
          35 }

          附上作者原文:長見識了。原文:https://blog.csdn.net/Wu_qz/article/details/81274158


    


  • 指向函數的指針的應用示例:
  • 示例代碼1:
    •  1 #define  GET_MAX     0
       2 #define  GET_MIN     1
       3  
       4 int get_max(int i,int j)
       5 {
       6     return i>j?i:j;
       7 }
       8  
       9 int get_min(int i,int j)
      10 {
      11     return i>j?j:i;
      12 }
      13  
      14 int compare(int i,int j,int flag)
      15 {
      16     int ret;
      17  
      18     //這裏定義了一個函數指針,就可以根據傳入的flag,靈活地決定其是指向求大數或求小數的函數
      19     //便於方便靈活地調用各類函數
      20     int (*p)(int,int);
      21  
      22     if(flag == GET_MAX)
      23         p = get_max;
      24     else
      25         p = get_min;
      26  
      27     ret = p(i,j);
      28  
      29     return ret;
      30 }
      31  
      32 int main()
      33 {
      34     int i = 5,j = 10,ret;
      35  
      36     ret = compare(i,j,GET_MAX);
      37     printf("The MAX is %d\n",ret);
      38  
      39     ret = compare(i,j,GET_MIN);
      40     printf("The MIN is %d\n",ret);
      41  
      42     return 0 ;
      43 }
  • 示例代碼2:
    •  1 #include <stdio.h>
       2 #include <string.h>
       3  
       4 void check(char *a,char *b,int (*cmp)(const char *,const char *));
       5  
       6 main()
       7 {
       8     char s1[80],s2[80];
       9     int (*p)(const char *,const char *);
      10  
      11     //將庫函數strcmp的地址賦值給函數指針p
      12     p=strcmp;
      13  
      14     printf("Enter two strings.\n");
      15     gets(s1);
      16     gets(s2);
      17  
      18     check(s1,s2,p);
      19 }
      20  
      21 void check(char *a,char *b,int (*cmp)(const char *,const char *))
      22 {
      23     printf("Testing for equality.\n");
      24     //表達式(*cmp)(a,b)調用strcmp,由cmp指向庫函數strcmp(),由a和b作調用strcmp()的參數。
      25     //調用時,與聲明的情況類似,必須在*cmp周圍使用一對括號,使編譯程序正確操作,
      26     //同時這也是一種良好的編碼風格,指示函數是通過指針調用的,而不是函數名。
      27     if((*cmp)(a,b)==0)
      28         printf("Equal\n");
      29     else
      30         printf("Not Equal\n");
      31 }
  • 示例代碼3:
    •  1 #include <stdio.h>
       2 #include <ctype.h>
       3 #include <stdlib.h>
       4 #include <string.h>
       5 //check()函數的第3個函數是函數指針,就可以根據具體情況傳入不同的處理函數
       6 void check(char *a,char *b,int (*cmp)(const char *,const char *));
       7  
       8 //自定義的比較兩個字符串的函數
       9 int compvalues(const char *a,const char *b);
      10  
      11 main()
      12 {
      13     char s1[80],s2[80];
      14  
      15     printf("Enter two values or two strings.\n");
      16     gets(s1);
      17     gets(s2);
      18  
      19     //如果是數字,則用函數指針傳入數字比較函數進行處理
      20     if(isdigit(*s1)){
      21         printf("Testing values for equality.\n");
      22         check(s1,s2,compvalues);
      23     }
      24     //如果是字符串,則用函數指針傳入庫函數strcmp進行處理
      25     else{
      26         printf("Testing strings for equality.\n");
      27         check(s1,s2,strcmp);
      28     }
      29 }
      30  
      31 void check(char *a,char *b,int (*cmp)(const char *,const char *))
      32 {
      33     if((*cmp)(a,b)==0)
      34         printf("Equal.\n");
      35     else
      36         printf("Not Equal.\n");
      37 }
      38  
      39 int compvalues(const char *a,const char *b)
      40 {
      41     if(atoi(a)==atoi(b))
      42         return 0;
      43     else
      44         return 1;
      45 }




四、指針的指針與指針的引用

  吃個飯補充

技術分享圖片

C++——指針---指向數組的指針---指向字符串的指針--指向函數的指針--指針的指針--指針的引用