C/C++基礎知識:函數指針和指針函數的基本概念

【函數指針】

?????? 在程序運行中,函數代碼是程序的算法指令部分,它們和數組一樣也占用存儲空間,都有相應的地址。可以使用指針變量指向數組的首地址,也可以使用指針變量指向函數代碼的首地址,指向函數代碼首地址的指針變量稱為函數指針。

1.函數指針定義

函數類型 (*指針變量名)(形參列表);

“函數類型”說明函數的返回類型,由于“()”的優先級高于“*”,所以指針變量名外的括號必不可少,后面的“形參列表”表示指針變量指向的函數所帶的參數列表。

例如:

int (*f)(int x);

double (*ptr)(double x);

在定義函數指針時請注意:
????
函數指針和它指向的函數的參數個數和類型都應該是—致的;

函數指針的類型和函數的返回值類型也必須是一致的。

2.函數指針的賦值

函數名和數組名一樣代表了函數代碼的首地址,因此在賦值時,直接將函數指針指向函數名就行了。

例如,

int func(int x);?? /* 聲明一個函數 */

int (*f) (int x);??? /* 聲明一個函數指針 */

f=func;??????????? /* 將func函數的首地址賦給指針f */

賦值時函數func不帶括號,也不帶參數,由于func代表函數的首地址,因此經過賦值以后,指針f就指向函數func(x)的代碼的首地址。

3.通過函數指針調用函數

函數指針是通過函數名及有關參數進行調用的。

與其他指針變量相類似,如果指針變量pi是指向某整型變量i的指針,則*p等于它所指的變量i;如果pf是指向某浮點型變量f的指針,則*pf就等價于它所指的變量f。同樣地,*f是指向函數func(x)的指針,則*f就代表它所指向的函數func。所以在執行了f=func;之后,(*f)和func代表同一函數。

由于函數指針指向存儲區中的某個函數,因此可以通過函數指針調用相應的函數。現在我們就討論如何用函數指針調用函數,它應執行下面三步:

首先,要說明函數指針變量。

例如:int (*f)(int x);

其次,要對函數指針變量賦值。

例如: f=func;??? (func(x)必須先要有定義)

最后,要用 (*指針變量)(參數表);調用函數。

例如:??? (*f)(x);(x必須先賦值)


【例】任意輸入n個數,找出其中最大數,并且輸出最大數值。

main()

{

??????? int f();

??????? int i,a,b;

??????? int (*p)();??? /* 定義函數指針 */

??????? scanf("%d",&a);

??????? p=f;??????????? /* 給函數指針p賦值,使它指向函數f */

??????? for(i=1;i<9;i++)

??????? {
??????????????? scanf("%d",&b);

??????????????? a=(*p)(a,b);??? /* 通過指針p調用函數f */

??????? }

??????? printf("The Max Number is:%d",a)

}


f(int x,int y)

{

??? int z;

??? z=(x>y)?x:y;

??? return(z);

}

運行結果為:

343 -45 4389 4235 1 -534 988 555 789↙

The Max Number is:4389


【指針函數】

一個函數不僅可以帶回一個整型數據的值,字符類型值和實型類型的值,還可以帶回指針類型的數據,使其指向某個地址單元。

??????? 返回指針的函數,一般定義格式為:

??????? 類型標識符??? *函數名(參數表)

int *f(x,y);

其中x,y是形式參數,f是函數名,調用后返回一個指向整型數據的地址指針。f(x,y)是函數,其值是指針。

如:char *ch();表示的就是一個返回字符型指針的函數,請看下面的例題:

【例】將字符串1(str1)復制到字符串2(str2),并輸出字符串2.

#include "stdio.h"

main()

{

??? char *ch(char *,char *);

??? char str1[]="I am glad to meet you!";

??? char str2[]="Welcom to study C!";

??? printf("%s",ch(str1,str2));

}

char *ch(char *str1,char *str2)

{

??? int i;

??? char *p;

??? p=str2
????
??? if(*str2==NULL) exit(-1);

??? do

??? {

??????? *str2=*str1;

??????? str1++;

??????? str2++;

??? }while(*str1!=NULL);

??? return(p);

}


通過分析可得

函數指針是一個指向函數的指針,而指針函數只是說明他是一個返回值為指針的函數,

函數指針可以用來指向一個函數。

參考:http://www.kuqin.com/language/20080614/9502.html

轉載于:https://www.cnblogs.com/zhanjxcom/p/4417053.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257443.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257443.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257443.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

告警系統郵件引擎

2019獨角獸企業重金招聘Python工程師標準>>> 20.23-20.25 告警系統郵件引擎 創建發郵件的腳本——mail.py [rootlocalhost mail]# pwd /usr/local/sbin/mon/mail[rootlocalhost mail]# vim mail.py #!/usr/bin/env python #-*- coding: UTF-8 -*- import os,sys rel…

【HTTP 2】簡介(Introduction)

前情提要 在上一篇文章《【HTTP 2.0】 序言》中&#xff0c;我們簡要介紹了 HTTP 2 協議的概要和協議狀態。 在本篇文章中&#xff0c;我們將會了解到 HTTP 2 協議簡介&#xff08;Introduction&#xff09;部分的內容。 簡介&#xff08;Introduction&#xff09; 超文本傳輸協…

java測試類生成對象,java編寫student類 用Java編寫一段測試程序,生成student類的兩個對象,并輸出每個對象基本信息?...

java中怎么創建對象數組&#xff1f;比如我創建了一個學生類Student&#xff0c;怎么用這個類創建一個對象數組&#xff0c;麻煩給個例子&#xff1f;學生類&#xff1a;classA{privateStringnameprivateintagepublicStringgetName(){returnname}publicvoidsetName(Stringname)…

iOS -- SKScene類

SKScene類 繼承自SKEffectNode:SKNode:UIResponder:NSObject符合NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject)框架 /System/Library/Frameworks/SpriteKit.framework可用性可用于iOS 7.0或者更晚的版本聲明于SKScene.h參考指南Sprite Kit Progamming Guide概覽 重要提…

SSD硬盤 全盤安全擦除

此文From http://ssd.zol.com.cn/575/5753057.html 在SSD固態硬盤的使用過程中&#xff0c;部分用戶可能會碰到計算機意外掉電或死機并強行斷電后&#xff0c;系統出現異常&#xff0c;掃描SSD后發現壞塊&#xff0c;然后一著急一跺腳甚至想返廠維修。 其實掉電后固態硬盤出現壞…

php中等3秒再跳轉,跳轉和重定向

頁面跳轉在應用開發中&#xff0c;經常會遇到一些帶有提示信息的跳轉頁面&#xff0c;例如操作成功或者操作錯誤頁面&#xff0c;并且自動跳轉到另外一個目標頁面。系統的ThinkController類內置了兩個跳轉方法success和error&#xff0c;用于頁面跳轉提示&#xff0c;而且可以支…

2017敏捷沙灘大會:完美軟件,測量持續交付,以及探索未來

在英國康沃爾郡舉行的2017敏捷沙灘大會上&#xff0c;數百名演講者和參與者共聚一堂&#xff0c;探討敏捷和后敏捷領域軟件開發方法有哪些最新進展。本次大會最后一個下午的要點包括&#xff1a;交付團隊可以通過擁抱精益、迭代和持續的部署方法更快速地實現業務價值&#xff1…

做fzu oj 1045 做減法學到的sprintf()函數

題目 做題一直輸不出答案&#xff0c;于是就上網去百度了這題的解題&#xff0c;發現解答十分的簡短&#xff0c;而且其中我看見了平時沒見過的函數&#xff0c;sprintf()。 于是就百度sprintf()的使用。 如下&#xff1a; 函數功能&#xff1a;把格式化的數據寫入某個字符串 函…

動態內存分配及變量存儲類別(第二部分)

5. C語言變量的存儲類別和生存期 我們知道&#xff0c;變量是有數據類型的&#xff0c;用以說明它占用多大的內存空間&#xff0c;可以進行什么樣的操作。除了數據類型&#xff0c;變量還有一個屬性&#xff0c;稱為“存儲類別”。存儲類別就是數據在內存中的存放區域。一個正在…

oracle的em能干什么,轉載?解決Oracle的EM登錄

轉載 解決Oracle的EM登錄(2011-03-13 20:53:39)標簽&#xff1a;雜談這幾天解決了EM無法登錄的問題&#xff0c;順便也把j數據庫程序中常出現的ORA_12518錯誤解決了&#xff0c;有必要總結一下&#xff0c;我最初遇到的情況是這樣的&#xff1a;1. 編寫java程序訪問oracle數據庫…

python 回溯法 子集樹模板 系列 —— 1、8 皇后問題

問題 88格的國際象棋上擺放八個皇后&#xff0c;使其不能互相攻擊&#xff0c;即任意兩個皇后都不能處于同一行、同一列或同一斜線上&#xff0c;問有多少種擺法。 分析 為了簡化問題&#xff0c;考慮到8個皇后不同行&#xff0c;則每一行放置一個皇后&#xff0c;每一行的皇后…

Core Java Volume I — 3.6. Strings

3.6. StringsConceptually, Java strings are sequences of Unicode characters&#xff08;Java的字符串是一個Unicode序列&#xff09;. For example, the string "Java\u2122" consists of the five Unicode characters J, a, v, a, and ?. Java does not have a…

Android實用代碼七段(五)

前言 每次分享意味著每次都有進步&#xff0c;本系列以實用為主&#xff0c;歡迎和我分享和推薦好用的代碼段~~聲明歡迎轉載&#xff0c;但請保留文章原始出處:) 博客園&#xff1a;http://www.cnblogs.com農民伯伯&#xff1a; http://over140.cnblogs.com 正文 1、展開、收起…

oracle 自增1,oracle自增無法從1開始

問題描述我想讓XH字段從1開始增加,由于是varchar類型的,所以就用這種方式,但我發現我的數據表中XH字段是從217開始增加的,為什么啊問題出現的環境背景及自己嘗試過哪些方法相關代碼// 請把代碼文本粘貼到下方(請勿用圖片代替代碼)declarej number;i number;begini:1;j:1;for i …

ceph Luminous版手動安裝零散記錄

1.安裝必要的依賴包&#xff0c;關防火墻&#xff0c;向/etc/hosts內添加域名等 2.安裝ceph 配置yum源 (如果嫌慢&#xff0c;可以配置cachedir/home/yum/$basearch/$releasever和keepcache1兩個參數&#xff0c;在第一次安裝時將安裝包下載到本地做成yum源&#xff0c;給后面的…

C#最簡單最完整的webservice實例

我做java&#xff0c;但最近接觸crm所以必須研究一下C#中的webservice以備后用&#xff0c;其實就是個新手&#xff0c;哈哈&#xff0c;這個實例是我在參考了網上諸多不完整的例子的情況下&#xff0c;自己摸索完成的。期間遇到過一系列的棘手的問題&#xff0c;經過個人努力終…

2015 UESTC 數據結構專題G題 秋實大哥去打工 單調棧

秋實大哥去打工 Time Limit: 1 Sec Memory Limit: 256 MB 題目連接 http://acm.uestc.edu.cn/#/contest/show/59Description 天行健&#xff0c;君子以自強不息。地勢坤&#xff0c;君子以厚德載物。天天過節的秋實大哥又要過節了&#xff0c;于是他要給心愛的妹子買禮物。但由…

oracle怎么通過sid確定表名,如何獲取Oracle的SID列表

更好的方法是&#xff0c;如果您有權訪問主機并且Oracle安裝使用以下命令&#xff1a;lsnrctl status。這適用于Unix&#xff0c;Linux和Windows機器。 status命令將顯示所有監聽器(及其相關的SID)。C:\>lsnrctl statusLSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Pr…

51 Nod 1007 正整數分組【類01背包】

1007 正整數分組 基準時間限制&#xff1a;1 秒 空間限制&#xff1a;131072 KB 分值: 10難度&#xff1a;2級算法題將一堆正整數分為2組&#xff0c;要求2組的和相差最小。例如&#xff1a;1 2 3 4 5&#xff0c;將1 2 4分為1組&#xff0c;3 5分為1組&#xff0c;兩組和相差1…

YTU 2924: 文件操作--二進制文件讀入

2924: 文件操作--二進制文件讀入 時間限制: 1 Sec 內存限制: 128 MB提交: 58 解決: 20題目描述 現有100名學生的姓名(name)、學號(num)、英語(English)、數學(Math)、語文(Chinese)成績存儲在一個二進制文件student.dic中(姓名用char[20]&#xff0c;學號和各科成績用int存儲…