欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言指針基礎(chǔ)知識(shí)實(shí)例講解

 更新時(shí)間:2021年02月25日 16:34:44   作者:學(xué)習(xí)之凱  
這篇文章主要介紹了C語(yǔ)言指針基本知識(shí)實(shí)例講解,文中實(shí)例講解的很清晰,有不太懂的同學(xué)可以研究下

對(duì)程序進(jìn)行編譯的時(shí)候,系統(tǒng)會(huì)把變量分配在內(nèi)存單位中,根據(jù)不同的變量類型,分配不同的字節(jié)大小。比如int整型變量分配4個(gè)字節(jié),char字符型變量分配1個(gè)字節(jié)等等。被分配在內(nèi)存的變量,可以通過(guò)地址去找到,內(nèi)存區(qū)每一個(gè)字節(jié)都有一個(gè)編號(hào),地址也可以形象的理解成我們生活中的住址,通過(guò)住址找到每一個(gè)人所在的地方。指針作為一個(gè)變量用來(lái)存放地址,可以通過(guò)指針來(lái)改動(dòng)變量。

上圖就是一個(gè)簡(jiǎn)單的定義一個(gè)一級(jí)指針變量和利用指針改變變量數(shù)值的過(guò)程。int*表示整型指針,*p表示解引用操作,就是利用指針找到a的地址然后再改變a的值。

地址用%p打印,用十六進(jìn)制表示,在打印時(shí)候輸入指針變量p和取地址a得出的結(jié)果是相同的,證明了指針是用來(lái)存放地址的。

指針作為一個(gè)變量是有大小的,其大小在32位平臺(tái)是4個(gè)字節(jié),64位平臺(tái)上是8個(gè)字節(jié),大小與指針的類型無(wú)關(guān)。

上圖以32位平臺(tái)舉例子,可以看到無(wú)論指針是整型、字符型、浮點(diǎn)型也無(wú)論一級(jí)指針還是二級(jí)指針,其在內(nèi)存空間所占的大小都是4個(gè)字節(jié)。

指針有多種類別,按照級(jí)數(shù)來(lái)分便可以分為一級(jí)指針,二級(jí)指針,三級(jí)指針等等

一級(jí)指針是最基礎(chǔ)的指針,指向的是創(chuàng)建的變量的地址。就類似于上圖的前三個(gè)sizeof后面所寫(xiě)的。前文講到指針也是一個(gè)變量,是用來(lái)存放地址的。既然是一個(gè)變量,就也要在內(nèi)存開(kāi)辟空間,開(kāi)辟了空間就也會(huì)產(chǎn)生屬于指針變量自己的地址。二級(jí)指針便是用來(lái)存放一級(jí)指針地址的。以此類推多級(jí)指針也是如此。

指針也可以根據(jù)指針指向的變量的數(shù)據(jù)類型來(lái)進(jìn)行分類,有整型指針,字符指針,數(shù)組指針,函數(shù)指針等等

整型指針和字符指針

這兩個(gè)是比較常見(jiàn)和容易理解的指針,依次用int*和char*表示,他們的區(qū)別在于指向變量類型不同,內(nèi)存也不一樣,在進(jìn)行解引用操作時(shí)訪問(wèn)的字節(jié)大小也因?yàn)樽兞款愋偷膮^(qū)別會(huì)有所差異。整型指針可以訪問(wèn)4個(gè)字節(jié),而字符指針只能訪問(wèn)1個(gè)字節(jié)。也就是說(shuō)對(duì)整型指針變量解引用,一次可以操作一個(gè)整型,而對(duì)字符變量解引用一次只能操作一個(gè)字符。

較為特殊的char*p="hello"這并不是將整個(gè)字符串的地址傳個(gè)了p,而是傳了字符穿首元素‘h'的地址,可以通過(guò)'h‘的地址來(lái)找到整個(gè)字符串。此時(shí)出現(xiàn)char*p2=“hello”,p2和p代表的是同一處地址,因?yàn)閔ello是常量字符串,沒(méi)有必要開(kāi)辟兩塊不同的空間的來(lái)存儲(chǔ)它。這是字符指針的一個(gè)特性。

void型指針

void型的指針可以接受任何類型的地址,但是不能對(duì)void型指針進(jìn)行解引用操作。解引用操作要有特定的訪問(wèn)字節(jié)的數(shù)量,比如對(duì)整型指針解引用就是訪問(wèn)4個(gè)字節(jié),字符型指針解引用就是訪問(wèn)1個(gè)字節(jié),而void型指針無(wú)法確定訪問(wèn)字節(jié)個(gè)數(shù),所以不能進(jìn)行解引用操作。同時(shí)void*這種類型的指針也不能進(jìn)行加減整數(shù)的操作,因?yàn)闊o(wú)法確定跳過(guò)的字節(jié)個(gè)數(shù)。

此圖表示了void型指針可以接受任意類型的地址。

數(shù)組指針

這是一種指向數(shù)組的指針,例如int(*p)[10]這就是一個(gè)指向數(shù)組的指針,它指向的數(shù)組有10個(gè)元素,每個(gè)元素都是整型。給*p加上括號(hào)是因?yàn)閜和[10]優(yōu)先結(jié)合,這樣的話就變成了一個(gè)數(shù)組而不是指針了。這個(gè)數(shù)組叫指針數(shù)組,int*p[10]這樣的寫(xiě)法意思是一個(gè)有10個(gè)元素的數(shù)組,每一個(gè)元素都是整型指針,這和數(shù)組指針是兩個(gè)不同的東西。

指向數(shù)組的指針里面存放的便是數(shù)組的地址,而非數(shù)組某個(gè)元素的地址,所以在定義數(shù)組指針時(shí)要用 &+數(shù)組名,而不是簡(jiǎn)單使用 數(shù)組名。

上圖顯示出&arr和arr的不同,雖然起始地址相同,但arr+1只讓指針向后移動(dòng)了一個(gè)元素的空間,而&arr+1讓指針移動(dòng)了一個(gè)數(shù)組的空間。

函數(shù)指針

函數(shù)指針顧名思義就是指向函數(shù)的指針,每個(gè)函數(shù)都有一個(gè)入口,這個(gè)入口的地址便是函數(shù)指針?biāo)赶虻牡刂贰:瘮?shù)地址的表示方法為 函數(shù)名或 &+函數(shù)名。例如一個(gè)函數(shù)叫Add,&Add和Add都是表示這個(gè)函數(shù)的地址沒(méi)有什么差別。函數(shù)指針的寫(xiě)法是 函數(shù)的返回類型(*)(函數(shù)的參數(shù)),例如函數(shù)Add,其函數(shù)指針的寫(xiě)法就是int(*p)(int,int)=Add 。*p要加上括號(hào)來(lái)保證*和p的優(yōu)先結(jié)合來(lái)形成一個(gè)指針變量,如果不加括號(hào)來(lái)優(yōu)先結(jié)合,則會(huì)出現(xiàn)int* p(int,int)這樣的寫(xiě)法,這就變成了函數(shù)的聲明,這個(gè)函數(shù)的返回類型是int*,函數(shù)的名字叫p,函數(shù)的參數(shù)是2個(gè)整型和原先的函數(shù)指針不是同一個(gè)意思。

用函數(shù)指針調(diào)用函數(shù)時(shí)可以不加*這個(gè)解引用符號(hào),因?yàn)檫@個(gè)符號(hào)將不會(huì)在程序運(yùn)行的時(shí)候起到作用。

上圖顯示了*這個(gè)解引用符號(hào)在函數(shù)指針調(diào)用函數(shù)時(shí)候不起作用,以上的寫(xiě)法都可以用。

根據(jù)函數(shù)指針的相關(guān)知識(shí),可以來(lái)看這兩段代碼。

代碼1中間的 void(*)()是一個(gè)函數(shù)指針類型,將這個(gè)函數(shù)指針類型放在括號(hào)中,是強(qiáng)制類型轉(zhuǎn)換的意思也就是把0強(qiáng)制轉(zhuǎn)換成一個(gè)函數(shù)指針,強(qiáng)制類型轉(zhuǎn)換這個(gè)部分簡(jiǎn)單寫(xiě)出來(lái)就是“(函數(shù)指針)0”是將0作為一個(gè)函數(shù)的地址,而最外層的括號(hào)(*函數(shù)的地址)()這個(gè)是解引用操作,也就是通過(guò)0這個(gè)地址,找到了0地址處所在的函數(shù),并且進(jìn)行調(diào)用。

代碼2 內(nèi)部的(int,void(*)(int))這一段表示的函數(shù)的參數(shù),第一個(gè)參數(shù)是一個(gè)整型,第二個(gè)參數(shù)是一個(gè)函數(shù)指針類型,這個(gè)函數(shù)指針指向的函數(shù)的返回類型是void,參數(shù)類型是int。而這個(gè)函數(shù)的名字就是signal。解決了這個(gè)部分的內(nèi)容,剩下的就是void(*)(int),去除里面的signal函數(shù)可以很明顯地看出來(lái)這是一個(gè)函數(shù)指針。一個(gè)函數(shù)由三部分組成,返回類型,函數(shù)名,函數(shù)的參數(shù)。也就是說(shuō)參數(shù)和函數(shù)名去掉之后,函數(shù)聲明中就只剩下一個(gè)返回類型。此時(shí),函數(shù)名和參數(shù)已經(jīng)在前一步分析中得出,剩下的void(*)(int)便就是函數(shù)的返回類型,這個(gè)函數(shù)返回類型是也是一個(gè)函數(shù)指針。

這兩個(gè)代碼來(lái)自于書(shū)本《C陷阱和缺陷》。

函數(shù)指針和數(shù)組的結(jié)合實(shí)例,簡(jiǎn)易的計(jì)算器,這是函數(shù)指針數(shù)組的應(yīng)用

數(shù)組傳參


數(shù)組在傳參的時(shí)候傳的是首元素的地址,數(shù)組名表示首元素的地址。函數(shù)的形參可以用數(shù)組形式表示也可以用指針形式表示。

一維數(shù)組的傳參比較簡(jiǎn)單,例如int arr[3]這個(gè)數(shù)組,形參可以直接使用int arr[]或者int arr[3]用數(shù)組形式表示形參,形參處的元素個(gè)數(shù)可以寫(xiě)也可以不寫(xiě),因?yàn)樵貍€(gè)數(shù)在這里不起作用?;蛘哂靡患?jí)指針表示,int* arr這樣就反映了指針傳參傳的是首元素地址。

二維數(shù)組傳參相對(duì)比較復(fù)雜,由數(shù)組的知識(shí)可以知道,二維數(shù)組必須有規(guī)定的列數(shù),所以要以數(shù)組形式傳參的時(shí)候列數(shù)不能省略。

以指針形式傳參,數(shù)組名仍然是首元素地址的意思,作為一個(gè)二維數(shù)組,首元素便是第一行的數(shù)組。比如int arr[3][5]這個(gè)二維數(shù)組的首元素是一個(gè)含有5個(gè)整型元素的數(shù)組,所以在傳參的時(shí)候傳的指針也應(yīng)該是指向這個(gè)數(shù)組的指針。所以此時(shí)形參應(yīng)該表示為int (*arr)[5],這表示一個(gè)數(shù)組指針,指向一個(gè)含有5個(gè)整型元素的數(shù)組,符合正確的傳參規(guī)則。

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

回調(diào)函數(shù)是把函數(shù)指針作為參數(shù)傳給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)。回調(diào)函數(shù)不是由函數(shù)實(shí)現(xiàn)方直接調(diào)用,而是用另外一方或者特定條件下來(lái)調(diào)用。

比較常見(jiàn)的例子就是C語(yǔ)言里面的庫(kù)函數(shù)快速排序,這里需要自己實(shí)現(xiàn)的比較函數(shù),就用到了回調(diào)函數(shù),int_cmp作為函數(shù)的指針充當(dāng)了qsort的參數(shù)。

模擬實(shí)現(xiàn)qsort快速排序函數(shù),冒泡排序的推廣

到此這篇關(guān)于C語(yǔ)言指針基本知識(shí)實(shí)例講解的文章就介紹到這了,更多相關(guān)C語(yǔ)言指針基本知識(shí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言二維數(shù)組指針的概念及使用

    C語(yǔ)言二維數(shù)組指針的概念及使用

    C語(yǔ)言中的二維數(shù)組是按行排列的,也就是先存放a[0]行,再存放a[1]行,最后存放a[2]行;每行中的4個(gè)元素也是依次存放。數(shù)組a為int類型,每個(gè)元素占用4個(gè)字節(jié),整個(gè)數(shù)組共占用48個(gè)字節(jié)
    2023-02-02
  • C++協(xié)程實(shí)現(xiàn)序列生成器的案例分享

    C++協(xié)程實(shí)現(xiàn)序列生成器的案例分享

    序列生成器通常的實(shí)現(xiàn)是在一個(gè)協(xié)程內(nèi)部通過(guò)某種方式向外部傳一個(gè)值出去,并且將自己掛起,本文圍繞序列生成器這個(gè)經(jīng)典的協(xié)程案例介紹了協(xié)程的銷毀、co_await 運(yùn)算符、await_transform 以及 yield_value 的用法,需要的朋友可以參考下
    2024-05-05
  • 從零學(xué)習(xí)構(gòu)造系統(tǒng)之bazel示例詳解

    從零學(xué)習(xí)構(gòu)造系統(tǒng)之bazel示例詳解

    這篇文章主要為大家介紹了從零學(xué)習(xí)構(gòu)造系統(tǒng)之bazel示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單版三子棋

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單版三子棋

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單版三子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C語(yǔ)言判定一棵二叉樹(shù)是否為二叉搜索樹(shù)的方法分析

    C語(yǔ)言判定一棵二叉樹(shù)是否為二叉搜索樹(shù)的方法分析

    這篇文章主要介紹了C語(yǔ)言判定一棵二叉樹(shù)是否為二叉搜索樹(shù)的方法,結(jié)合實(shí)例形式綜合對(duì)比分析了C語(yǔ)言針對(duì)二叉搜索樹(shù)判定的原理、算法、效率及相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-08-08
  • 利用Matlab繪制有趣圖像的示例代碼

    利用Matlab繪制有趣圖像的示例代碼

    這篇文章主要為大家總結(jié)了一些利用Matlab繪制的有趣好看的圖像的示例代碼。文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以動(dòng)手試一試
    2022-03-03
  • c++實(shí)現(xiàn)對(duì)輸入數(shù)組進(jìn)行快速排序的示例(推薦)

    c++實(shí)現(xiàn)對(duì)輸入數(shù)組進(jìn)行快速排序的示例(推薦)

    下面小編就為大家?guī)?lái)一篇c++實(shí)現(xiàn)對(duì)輸入數(shù)組進(jìn)行快速排序的示例(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中堆排序的分析總結(jié)

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中堆排序的分析總結(jié)

    堆是計(jì)算機(jī)科學(xué)中一類特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱,通常是一個(gè)可以被看做一棵完全二叉樹(shù)的數(shù)組對(duì)象。而堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。本文將通過(guò)圖片詳細(xì)介紹堆排序,需要的可以參考一下
    2022-04-04
  • C++示例講解string容器

    C++示例講解string容器

    c++相比c的一個(gè)好處就是實(shí)現(xiàn)了很多的容器和泛型算法,使得程序員的工作得到了很大的簡(jiǎn)化,本文重點(diǎn)給大家介紹C++string容器基本概念講解,需要的朋友參考下吧
    2022-07-07
  • C語(yǔ)言實(shí)現(xiàn)控制臺(tái)掃雷小游戲

    C語(yǔ)言實(shí)現(xiàn)控制臺(tái)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)控制臺(tái)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評(píng)論