C++——指針---指向數組的指針---指向字符串的指針--指向函數的指針--指針的指針--指針的引用
阿新 • • 發佈:2019-01-13
編號 函數名 員工 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) {
-
二、指向字符串的指針
- 示例代碼:
-
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
-
- 函數指針的調用:
-
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++——指針---指向數組的指針---指向字符串的指針--指向函數的指針--指針的指針--指針的引用