1. 程式人生 > >指標作為函式引數/指標型別的函式/指向函式的指標(function pointer)

指標作為函式引數/指標型別的函式/指向函式的指標(function pointer)

指標作為函式引數:

為什麼需要指標做引數: 1. 需要資料雙向傳遞時(引用也可以達到此效果)

                                     2. 需要傳遞一組資料,只傳首地址執行效率比較高

example:

#include <iostream>
using namespace std;


const int N = 6;

void print(const int *p, int n); //這裡const是為了防止 通過指標改變了指標指向的值,代表指標指向的是一個常量

int mai(){
	int array[N];
	for (int i =0; i<N; i++)
		cin>>array[i];
	print(array, N);
	return 0;
}
void print(const int *p, int n){
	cout<<"{" <<*p;
	for (int i =1; i<n; i++)
		cout <<"," << *(p+1);
	cout <<"}"<<endl;
}

指標型別的函式:

語法形式:

儲存型別 資料型別 *函式名()

{ //函式主題

}

注意事項:不要將非靜態區域性地址用作函式的返回值//這代表這個地址是非法地址,因為有可能在呼叫函式中得到的地址是一個已經無效的地址

                 返回的指標要確保在主調函式中是有效,合法的地址

                  在子函式中通過動態記憶體分配new操作取得的記憶體地址返回給主函式是合法有效的。但是記憶體分配和釋放不在同一級別,要注意不要忘記釋放,避免記憶體洩漏。

指向函式的指標: 

指標裡面容納的是函式程式碼的首地址

函式指標的定義:

定義形式:

儲存型別 資料型別(*函式指標名)();//注意第一個括號,如果沒有這個括號則為指標型別的函式

例子:int (*p) (int i, int j);

含義:

函式指標指向的是程式程式碼儲存區

目的:

執行函式回撥  :將指標作為函式的形參

例子:

#include <iostream>
using namespace std;


int compute(int a, int b, int(*func)(int, int)){  // 這裡定義名為func的指標 作為形參
	return dunc(a,b);

}

int max(int a, int b){
	return ((a > b )? a:b);

}

int max(int a, int b){
	return ((a < b )? a:b);

}

int max(int a, int b){
	return (a+b);

}

int main(){
	int a, b, res;
	cout <<"Please insert an integer a: "; cin >>a;
	cout<<"Please insert an integer b: "; cin >> b;


	res = compute(a,b, & max); //& max 代表對max函式取址
	cout<<"Max of" << a << " and " << b << " is " << res <<endl;
	res = compute(a,b, & min); //& max 代表對max函式取址
	cout<<"Min of" << a << " and " << b << " is " << res <<endl;
	res = compute(a,b, & sum); //& max 代表對max函式取址
	cout<<"Sum of" << a << " and " << b << " is " << res <<endl;
}

相關推薦

指標作為函式引數指標型別函式指向函式指標function pointer

指標作為函式引數:為什麼需要指標做引數: 1. 需要資料雙向傳遞時(引用也可以達到此效果)                                     2. 需要傳遞一組資料,只傳首地址執行效率比較高example:#include <iostream>

C七:指向函式指標 ------ 函式指標function pointer

   函式具有可賦值給指標的實體記憶體地址,一個函式的函式名就是一個指標,它指向函式的程式碼。一個函式的地址是該函式的進入點,也是呼叫函式的地址。函式的呼叫可以通過函式名,也可以通過指向函式的指標來呼叫。函式指標還允許將函式作為變元傳遞給其他函式。       不帶括號和變

函式引數為值傳遞、引用傳遞和指標傳遞的區別:

1)值傳遞:int func(int value) { value++; return value; // 一般需要返回值 } int a=2; int b=func(a); //b==3;a==2;按值

指標作為引用引數

有時候,函式的確需要修改指標引數,使得該指標指向一個新的位置,程式設計師也需要這樣的修改,來影響實參。這就是以指標作為引數的唯一情況! 參考:《資料結構與面向物件程式設計》(C++版)Michael Main等編著 下面的例子建立了一個名為allocate_doubles

指標作為引用引數(二)

題目(一):編寫一個函式,把一個整數陣列中的前n個元素複製到另一個數組的前端。其中一個數組應該為常量引數,另一個數組應為為普通的陣列引數。 #include<iostream> using namespace std; //傳入其中一個數組為常量引數,另一個數

C語言陣列與指標作為傳遞引數的使用

       學習筆記中的內容多少會有一點文不對題,因為C語言中陣列無法作為函式的一個傳遞引數。而陣列名在作為函式傳遞引數使用的時候實際上也被轉換成了一個指標。 編寫如下程式碼; #include"s

Java類的組合與繼承 小問題分析建構函式引數的傳遞方法 、資料隱藏的處理: 對比C++

一、類的組合:     1、初始化問題(建構函式的引數傳遞方法):       在C++中,通常只要物件中不含有指標類資料的話,物件與物件之間是可以相互賦值且不會出錯的,因此組合出來的類完全可以將傳遞過來的物件引數直接賦值給對應資料成員;       而在java中,物

函式型別Function Types函式型別和其他型別一樣

函式型別(Function Types) 每個函式都有種特定的函式型別,由函式的引數型別和返回型別組成。 例如: 這個例子中定義了兩個簡單的數學函式:addTwoInts 和 multiplyTwoInts。這兩個函式都傳入兩個 Int型別, 返回一個合適的I

函式和常用模組【day06】:pickle模組十一

本節內容 1、dumps序列化和loads反序列化 2、dump序列化和load反序列化 3、序列函式 1、dumps序列化和loads反序列化 dumps()序列化 1

函式和常用模組【day06】:hashlib模組十二

本節內容 1、簡述 2、加密 3、sha1加密 4、sha256加密 5、sha384加密 6、sha512加密 7、hmac加密 一、簡述   我們寫程式中,經常需要對字串進行MD5加密,python中也支援這種加密,下面說說,這個加密模組:hashlib。 二、MD5加密

實現智慧指標Smart Pointer

#ifndef SMARTPTR_H_ #define SMARTPTR_H_ template<typename T> struct SmartPtr { explicit Smart

懸空指標Dangling pointer避免方法

什麼是懸空指標? 一個指標所指的記憶體被釋放後,這個指標就被懸空了。 懸空指標的危害? 訪問懸空指標,結果隨機。可能導致程式功能不正常,也可能導致程式崩潰。如果受到影響的是其它功能,問題通常很難定位。 如何避免懸空指標? 基本思路:在釋放一塊記憶體時,將指向這塊記憶體的指標變數設

一、函式模板Function Template

本系列是《C++Template》(作者:David Vandevoorde, Nicolai M. Josuttis)的學習總結。 1:函式模板(Function Template) 所謂函式模板是由引數表示的一系列的函式。函式模板可以被不同的型別引數

C++函式庫的理解:寫一個C++程式庫排序庫然後呼叫自己寫的庫附帶程式

1.自己寫一個庫:和建工程是一樣的,但是建的專案是DLL檔案,然後再其工程下新增原始檔和標頭檔案,原始檔正常寫,標頭檔案是有要求的,__declspec(dllexport)的加入,程式在下面是給出的,所以往下讀,你會有所得的!!最終得到DLL,LIB,以及.h檔案(.h檔案只是一個路徑,在

JavaScript中的函式過載Function overloading

說明 JavaScript 中沒有真正意義上的函式過載。 函式過載 函式名相同,函式的引數列表不同(包括引數個數和引數型別),根據引數的不同去執行不同的操作。 我們舉個例子看看 function overload(a){ conso

C++11系列——函式物件Function Object

之前總結過一篇Boost之高階函式——函式物件,介紹了幾個用於處理函式物件的 Boost C++ 庫。而目前C++11的標準庫std已經提供了函式物件的一些功能。 In mathematics and computer science, a high

matlab 函式控制代碼function handle

前言 函式控制代碼是一種MATLAB的資料型別,它包含引用函式的資訊。 使用函式控制代碼的好處 傳遞函式訪問資訊給其它的函式 允許對子函式和私有函式更廣的訪問 減少需要定義的函式的數量 改善重複操作的效能 下面給出一個簡單的例子 建

C++之函式物件/偽函式Function Object詳解

       除了自定義的函式物件,標準庫還為我們提供了一系列現成的函式物件, 比如常見的數學、邏輯運算等。例如:negate<type>(),plus<type>(),minus<type>(),multiplies<type&g

怎麼理解堆疊指標Stack Pointer

如果的堆疊的實現是往上長的(就是說往頂的方向長,其實質是棧底是定死的不能動,入棧的東西只能不斷往上疊,這就像在書桌上放書一樣,桌底是定死的,所以書只能一本一本地往上堆,往上長),計算機內部的堆疊的實現採取的就是這種模式,所以就得“先修改指標,然後插入數 據,出

C++之函式物件Function Object & for_each

函式物件 對於一些用到函式作為引數的c++STL演算法(如下面的for_each演算法函式),函式的傳遞當然可以用泛化的函式指標來進行,但是c++STL常使用的是函式物件,目的在於更簡潔、不依賴於當前