1. 程式人生 > >C++——指標---指向陣列的指標---指向字串的指標--指向函式的指標--指標的指標--指標的引用

C++——指標---指向陣列的指標---指向字串的指標--指向函式的指標--指標的指標--指標的引用

一、指向陣列的指標

  • 程式碼示例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 }

       

 




 

四、指標的指標與指標的引用

  吃個飯補充