C++——指標---指向陣列的指標---指向字串的指標--指向函式的指標--指標的指標--指標的引用
阿新 • • 發佈:2019-01-13
一、指向陣列的指標
- 程式碼示例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));//
-
二、指向字串的指標
- 示例程式碼:
-
1 char *pstr=”C++ is a object_oriented language”; 2 cout<<pstr<<endl;//直接列印整個字串而不是字串第一個字母的地址
-
三、指向函式的指標
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 }
-
四、指標的指標與指標的引用
吃個飯補充