最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C語言基礎(chǔ)知識(shí):最核心的—指針!知識(shí)總結(jié)(第二部分)

2022-09-24 15:33 作者:C語言編程__Plus  | 我要投稿

指針是C語言最重要也是最難理解的部分,它在我們平時(shí)的工作中無處不在。

今天我們繼續(xù)來看看指針的剩下的知識(shí)總結(jié)吧!上一批的話可以在主頁看到哦~


5 指針與結(jié)構(gòu)體

一個(gè)指針,它指向的可以是一個(gè)結(jié)構(gòu)體類型,這稱為結(jié)構(gòu)體指針。而一個(gè)結(jié)構(gòu)體,它的成員中也可以有指針成員。

上面的代碼中,定義了一個(gè)結(jié)構(gòu)體變量stu1。這個(gè)變量中有一個(gè)指針變量name。還定義了一個(gè)結(jié)構(gòu)體指針pstu。

我們想要通過結(jié)構(gòu)體指針訪問結(jié)構(gòu)體成員一般有以下兩種方式:


6 指針與const:常量指針與指針常量

初學(xué)者常常對(duì)這兩個(gè)概念搞錯(cuò)。首先,我認(rèn)為需要理解這里說的常量是什么意思。常量就是只可讀不可修改的。那常量指針和指針常量到底哪個(gè)是只可讀不可修改的呢?是指針還是指針指向的內(nèi)容?這里有一個(gè)方法,能讓你迅速明白哪個(gè)是不可修改的。就是在聲明時(shí),以星號(hào)(*)為界,分成兩部分,星號(hào)左邊的和星號(hào)右邊的。const在哪邊,那個(gè)就是只可讀不可修改的。以下面這個(gè)代碼為例,我們來分析一下:以星號(hào)(*)為界,星號(hào)左邊是char,沒有const關(guān)鍵詞,所以它指向的內(nèi)容不是常量。然后,我們看星號(hào)的右邊是const ptr,所以我們可以說ptr是一個(gè)常量。所以,這行代碼聲明了一個(gè)是常量的指針但是指向的內(nèi)容不是常量。即這個(gè)是一個(gè)指針常量。

類似的,我們也可以分析下面的代碼:


6.1 指針常量(Constant Pointers)

指針常量(Constant Pointers): 它的本質(zhì)是一個(gè)常量,只不過這個(gè)常量是指針。由于指針是只可讀不可修改的,所以這個(gè)指針不能指向別的地址了,但是該地址里的內(nèi)容還是可以改變的。指針常量的聲明格式如下:

我們來看下序:

上面這段程序中:

我們首先定義了兩個(gè)變量var1,var2;

然后,定義了一個(gè)指針常量ptr,并且指向了var1

接著,試圖讓ptr指向var2

最后,打印出指針ptr指向的地址的內(nèi)容

讓我們來運(yùn)行一下這個(gè)程序:

我們看到這個(gè)程序編譯報(bào)錯(cuò)了:試圖對(duì)只讀(read-only)變量ptr進(jìn)行賦值。所以,一旦我們定義了指針常量,那這個(gè)指針就不能指向其他變量了。

但是我們還是可以修改指向的地址里的內(nèi)容的:


6.2 常量指針(Pointer to Constants)

常量指針(Pointer to Constants):它的本質(zhì)是一個(gè)指針,只不過它指向的值是常量(只可讀,不可修改)。由于指向的是一個(gè)只可讀不修改的值,所以指針不能通過它存儲(chǔ)的地址間接修改這個(gè)地址的值,但是這個(gè)指針可以指向別的變量。

常量指針的聲明格式如下:

還是有一段程序:

我們還是來分析一下這個(gè)程序:

我們定義了一個(gè)變量 var1,并且初始化為0

然后我們定義了一個(gè)指針常量ptr,并且將它指向了var1

接著,試圖通過指針ptr來改變var1的值

最后,打印出ptr指向的地址的內(nèi)容。

我們進(jìn)行編譯:

編譯報(bào)錯(cuò)也很明顯: *ptr是一個(gè)只讀的。所以不能通過ptr來修改var1的值。

但是,我們可以將ptr指向其他的變量:


6.3 指向常量的常量指針

理解了上面兩種類型的話,理解這個(gè)就很容易了。指向常量的常量指針是指這個(gè)指針既不能指向其他的地址也不能通過地址修改內(nèi)容。

它的聲明格式如下:

同樣,下面一段程序,我想你一定知道哪里編譯錯(cuò)誤了。

編譯結(jié)果:


7 指針與函數(shù)

7.1 函數(shù)指針

指針與函數(shù)相結(jié)合有兩種情況:指針函數(shù)、函數(shù)指針。

指針函數(shù),它的本質(zhì)是一個(gè)函數(shù),它的返回值是一個(gè)指針。

函數(shù)名本身就是一個(gè)指針(地址),這個(gè)地址就是函數(shù)的入口地址。

輸出:

0000000000401550

而函數(shù)指針,它的本質(zhì)是一個(gè)指針。只不過它存的地址恰好是一個(gè)函數(shù)的地址罷了。

函數(shù)指針變量定義的格式一般是:

比如:

輸出:

可以發(fā)現(xiàn),兩者地址相等。

函數(shù)指針類型的定義:


比如:

這樣的好處就是,首先通過typedef定義一個(gè)函數(shù)指針類型PSUM,定義完后,PSUM就相當(dāng)于一種新的類型,可以用此類型去定義其他函數(shù)指針變量,就不用每次都使用int(*pSum)(int, int);來定義一個(gè)函數(shù)指針變量。

輸出:


7.2 回調(diào)函數(shù)

說到函數(shù)指針,那還有一個(gè)概念不得不提——回調(diào)函數(shù)。因?yàn)樵趯?shí)際的項(xiàng)目代碼中實(shí)在是太常見了。

回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)。

那為什么要使用回調(diào)函數(shù)呢?或者說使用回調(diào)函數(shù)有什么好處呢?回調(diào)函數(shù)允許用戶把需要調(diào)用的方法的指針作為參數(shù)傳遞給一個(gè)函數(shù),以便該函數(shù)在處理相似的事情時(shí),可以靈活的使用不同的方法。

怎么使用回調(diào)函數(shù):

如上述代碼:可以看到,Handle()函數(shù)里面的參數(shù)是一個(gè)指針,在main()函數(shù)里調(diào)用Handle()函數(shù)的時(shí)候,給它傳入了函數(shù)Callback_1()/Callback_2()/Callback_3()的函數(shù)名,這時(shí)候的函數(shù)名就是對(duì)應(yīng)函數(shù)的指針,也就是說,回調(diào)函數(shù)其實(shí)就是函數(shù)指針的一種用法。


8 二維指針

二維指針,或者二級(jí)指針。就是指向指針的指針。比如:

輸出如下:

從輸出結(jié)果也可以看到,pa存的內(nèi)容*pa= 000000000000000A,剛好與a的地址相同。而ppa存的內(nèi)容*ppa= 000000000061FE14也剛好等于pa的地址。它們之間的內(nèi)存關(guān)系可以用如下的圖表示:



8.1 命令行參數(shù)

處理命令行參數(shù)是指向指針的指針的一個(gè)用武之地。

一般main函數(shù)具有兩個(gè)形參。第一個(gè)通常稱為argc,它表示命令行參數(shù)的數(shù)目。第2個(gè)通常稱為argv,它指向一組參數(shù)值。由于參數(shù)的數(shù)目并沒有內(nèi)在的限制,所以argv指向這組參數(shù)值(從本質(zhì)上來說是一個(gè)數(shù)組)的第一個(gè)元素。這些元素的每個(gè)都是指向一個(gè)參數(shù)文本的指針。如果程序需要訪問命令行參數(shù),main函數(shù)在聲明時(shí)就要加上這些參數(shù)。

舉例:

在windows上執(zhí)行: \test2.exe hello world

輸出:

注意,如果命令行中傳遞的一個(gè)參數(shù)包括空格,就需要用 ""將參數(shù)括起來,比如:

.\test2.exe "hello word"

則上面的代碼將輸出:


9 結(jié)束語

本文關(guān)于指針的講解就結(jié)束了。我相信你一定對(duì)指針有更深入的了解。

對(duì)啦對(duì)啦!另外的話為了幫助大家,輕松,高效學(xué)習(xí)C語言/C++,我給大家分享我收集的資源,從最零基礎(chǔ)開始的教程到C語言項(xiàng)目案例,幫助大家在學(xué)習(xí)C語言的道路上披荊斬棘!可以來我粉絲群領(lǐng)取哦~

微信公眾號(hào):C語言編程學(xué)習(xí)基地

整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)最重要的是你可以在群里面交流提問編程問題哦!

編程學(xué)習(xí)書籍分享:

粉絲編程交流:


C語言基礎(chǔ)知識(shí):最核心的—指針!知識(shí)總結(jié)(第二部分)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
义乌市| 大理市| 乌海市| 黄骅市| 古交市| 托里县| 乌鲁木齐县| 新宁县| 阆中市| 炎陵县| 泰和县| 达州市| 全南县| 汕尾市| 滕州市| 龙门县| 淮北市| 漳平市| 南陵县| 启东市| 徐汇区| 苏州市| 佳木斯市| 云梦县| 秦皇岛市| 新干县| 合山市| 盐山县| 陈巴尔虎旗| 正宁县| 科技| 周口市| 甘南县| 寻甸| 监利县| 泾源县| 宁化县| 高尔夫| 溧水县| 青铜峡市| 乐清市|