国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C語言編程函數指針入門精講教程

C語言編程函數指針入門精講教程

2022-02-13 16:19高郵吳少 C/C++

大家在C語言的學習中一定會接觸指針這樣一個東西,而指針也是新手路上一定要消滅的boss,如果以后還要學習Java的同學更是要注重指針的學習,希望能夠有所幫助

 

一、指針引子

示例:我們常常接觸的指針大多有如下幾類:
整形指針-存放整形地址,指向整形
字符指針-存放字符地址,指向字符
數組指針-存放數組地址(注意不是數組首元素地址),指向數組

由以上三個例子,我們能總結指針的共同點:存放某個類型變量的地址,指向那個類型的變量,但是在講函數指針首先有一個問題:函數也有地址嗎?我們用一段簡單的代碼來驗證一下即可。

#include<stdio.h>
int Add(int x,int y)
{
   return x+y;
}
int main()
{
   printf("%p
",&Add);
   return 0;
}

屏幕上打印出地址:

C語言編程函數指針入門精講教程

所以答案是有的,函數也存在地址,那么也就衍生出了今天的知識點-函數指針。

 

二、使用步驟

 

1.取函數地址

我們知道&數組名,取出的是數組的地址。單獨一個數組名,取出的是數組首元素的地址。但是對于函數來說:函數名==&函數名

我們代碼驗證一下(示例):

#include<stdio.h>
int Add(int x,int y)
{
   return x+y;
}
int main()
{
   printf("%p
",&Add);
   printf("%p
",Add);
   return 0;
}

C語言編程函數指針入門精講教程

顯然,打印出來的地址是一樣的,但是這個時候也會有同學跳出來說:“那數組名和&數組名打印出來的地址還一樣呢,但意義明顯不一樣啊”。但是你想想,函數也沒有首元素等其他玩意啊,它就是它本身啊,它也不會出現什么函數首元素啊。

所以再次聲明:
在函數指針這一塊 函數名==&函數名,它的意義和值,都是一樣的

 

2.創建函數指針

我們知道,數組指針用來存放數組地址,整形指針用來存放整形地址。。。函數指針也不例外,它用來存放函數地址,我們現在定義一個p來存放Add地址,那它的類型怎么創建?我們來看一下具體步驟:

1.p是一個指針對吧,給它一個*是不是必須的 p變成了 * p。為了確保 * 和 p結合(如果沒有括號,*或者p有可能會與其他的一些符號結合,具體參見符號優先級)那我在 * p外面加一個括號便于觀看也沒有問題吧,也就是(*p)

2.那函數總得有參數啊,比如這里是Add(int x,int y)。參數x和y的類型是int
你指針指向的函數是不是要找一下它的參數。所以(*p)(int,int)

3.那函數還有一個性質啊,有沒有返回值,要是有的話,類型呢? 這里以Add為例,它是返回int型,所以我們指針也返回int 型 即int(*p)(int,int)

到這里Add函數指針的類型就創建完成啦即為*int(p)(int ,int)

需要注意的是:不同函數的參數類型和返回值類型是不一樣的,到時候需要根據不同函數對類型進行轉換,這里只是以Add函數為例,其他函數以此類推

ps:一個快速判別類型的方法――去掉變量的名字,剩下的就是類型
代碼如下(示例):

	int a = 10;//去掉a 類型int
	int arr[10] = { 0 };//去掉arr 類型int [10]
	int(*parr)[10] = &arr;//去掉parr 類型int(*)[10],數組指針,指向一個10int型元素的數組
	int(*pf)(int, int) = &Add;//去掉pf 類型int(*)(int,int)

 

3.通過函數指針調用函數的兩種方法

法一:
我們平時在調用函數的時候,一般就是函數名( ,)然后把參數傳進括號即可,那我們現在有函數指針了呀,指針怎么使用?p不是指向了函數Add嘛,我們用*解引用指針,得到的是地址里的東西,也就是說 *p==Add,用 * p(,)來傳參也可以實現Add函數的調用。代碼如下:

#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int ret = Add(2, 3);
	printf("%d
", ret);//ret=5
	int(*p)(int, int) = &Add;//p是一個指向函數Add的指針
	ret = (*p)(3, 3);//ret=6
	//p指向Add,對p解引用就是Add
	//簡言之:*p=Add
	//我們并不總是可以拿到變量,有時是拿到變量的地址
	//對應函數指針同樣的道理,有時不直接給你函數,給你函數地址,就這樣調用
	printf("%d
", ret);
}

法二:
我們在二.1取函數地址那一塊介紹了,在函數指針這一塊,函數名==&函數名, 也就是說創建函數指針的時候可以這樣寫:int(*p)(int, int) = Add,Add是賦給了p啊,你也可以認為:p就是Add。你可以這樣理解,法一是int(*p)(int, int) = &Add,是把Add的地址給p,所以用p來調用函數要解引用一下,但是法二p就是Add,那不用解引用了,直接調用。代碼如下:

#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	//我們由前面的知識知道:函數add取地址時,add=&add
	int(*p)(int, int) = Add;//把Add賦給p,這里p即可看做Add
	//與法一不同的是,法一將&Add賦給p,p是Add的地址,所以要解引用,這里p就可以看做是Add本身,可以不解引用
	int ret = p(3, 6);
	printf("%d", ret);
}//如果是為了方便理解,一般是用第一種方法,如果是為了操作方便,可以用第二種方法

 

三、函數指針進階

大家來看這樣一個代碼( * (void(*)() ) 0)(),乍一看非常復雜,我們來細化一下
1 . ( * (void( * )() ) 0)() 我們抽出加粗部分
這是我們熟悉的老朋友:void( * )(),這不就是一個函數指針嘛,該函數無參,返回類型void

2 . (void( * )() ) 0是什么?我們聯想一下(int)3.14,不就是對3.14強制類型轉換嘛,將3.14這個浮點型強制轉換成整形。這里同樣的道理,是將整形0強制轉換成類型為void( * )()的一個函數指針

3 .現在有了(void( * )() ) 0,我們在這個東西前面加一個 *,這個是什么意思,我們知道(void( * )() ) 0已經被轉換成一個指針(指針即地址)了,地址前面加一個 *表示解引用,取出地址里的東西,也就是找到了那個函數

4 .(void( * )() ) 0表示那個函數那再在后面加一個()即是對函數的調用,也就是( * (void(*)() ) 0)()

 

總結

提示:本文介紹了函數指針的原理和多種使用方法,對于函數指針想要進階提升的小伙伴一定要認真研讀本文中的進階題目,指針是一個大頭,但相信堅持不懈的你一定可以戰勝它,加油!

更多關于C語言函數指針的資料請關注服務器之家其它相關文章!

原文鏈接:https://blog.csdn.net/m0_57180439/article/details/119713262

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
主站蜘蛛池模板: av毛片 | 在线中文字幕视频 | 高清av电影 | 最新中文字幕在线 | 丁香伊人 | av网站观看 | av一区二区三区 | 中文字幕不卡 | 亚洲欧美视频在线播放 | 日韩精品一区二区三区av | 色多多导航 | 亚洲精品系列 | 精品成人av | 亚洲网站在线观看 | 亚洲精品成a人ⅴ香蕉片 | 国产精品高清一区二区 | 黄色av三级 | 国产成人精品亚洲日本在线观看 | 亚洲精品影院 | www中文字幕 | 香蕉福利视频 | 成人精品99 | 最新国产精品精品视频 | 成人在线观看av | 亚洲视频一区二区三区在线观看 | 99精品电影 | 日本在线视频免费观看 | 午夜激情视频在线观看 | 夜久久| 久久这里只有精品8 | 久久亚洲综合 | 国内成人自拍视频 | 秋霞电影院午夜伦 | 国产精品毛片久久久久久久明星 | 婷婷色综合 | 人妖天堂狠狠ts人妖天堂狠狠 | 中文字幕综合在线 | 中文字幕一区二区三区乱码图片 | 最新国产在线 | 免费看国产片在线观看 | 国产视频一区二区 |