1. 程式人生 > 其它 >指標函式與函式指標

指標函式與函式指標

一、函式指標

1.定義:是一個指標,類似其他資料型別的指標,該指標指向的是一個函式,也可以認為指向的是函式的入口地址

2.用法:先定義一個普通函式,再定義一個指標,指向該函式,再呼叫

3.優點

4.適用:

二、指標函式

1.定義:是一個函式,而這個函式的返回值是一個指標

2.用法:先定義一個指標函式,再定義一個指標,型別為函式返回型別

3.優點:

三、程式碼:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <string.h>
 5
6 using namespace std; 7 int swap1 (int p1,int p2)//函式指標的話首先要定義一個普通函式 8 { 9 if(p1>p2) 10 return p1; 11 else { 12 return p2; 13 } 14 } 15 int *swap2(int p1, int p2) //指標函式的話,就是普通函式加個*,表示返回的是個指標,即地址(可以類似考慮整形指標,字元指標等) 16 { 17 int *p = (int *)malloc(sizeof(int)); 18 ///
int *p;//這樣是申請不到記憶體的,用的時候會出錯的 19 printf("2The memeory address of p = 0x%x \n", p); 20 memset(p, 0, sizeof(int));//表示把p的位置用0填充sizeof(int)個位元組 21 if(p1>p2) 22 *p=p1; 23 else { 24 *p=p2; 25 } 26 printf("*p = %d \n", *p); 27 printf("*p1 = %d \n", p1); 28 return
p; 29 ///return &p1;//是錯的,返回的只能是一個指標不能是一個地址 30 } 31 32 int (*fun1)(int x,int y);//再定義一個函式指標,該函式指標的形式和函式一致 33 34 35 int main()//呼叫 36 { 37 int c=3;int d=4; 38 std::cout << "(c,d) = " << c << d << std::endl; 39 40 fun1 = swap1;//第一種寫法:函式名即指向函式的入口地址,編譯器在編譯的時候會指向這個入口地址, 41 (*fun1)(c,d); 42 std::cout << "(*fun1)(c,d) = " << (*fun1)(c,d) << std::endl; 43 44 fun1 = &swap1;//又有兩種寫法,取函式所在的地址 45 std::cout << "(*fun1)(c,d) = " << fun1(c,d) << std::endl; 46 47 //呼叫指標函式 48 // int *p0;//此時是未給p分配記憶體空間的,用的時候會出錯的 49 // printf("1The memeory address of p = 0x%x \n", p0); 50 int *p=&c;// 51 printf("2The memeory address of p = 0x%x \n", p); 52 53 p=swap2(c,d);//呼叫指標函式,函式的返回值是一個指標 54 std::cout << "(*fun1)(c,d) = " << *p<< std::endl; 55 }