tft每日頭條

 > 圖文

 > c語言指針深度講解

c語言指針深度講解

圖文 更新时间:2024-12-01 10:38:42

c語言指針深度講解?指針為C語言中一種數據類型,它是一種用以存放内存地址的特殊數據類型,指針類型和普通的int、double類型不同,它不是一個基礎類型,而是與C語言提供的基礎類型而形成的複合類型比如基礎類型有int、double、char,它們所對應的指針類型分别為int型指針、double型指針和char型指針,這些指針都有一個通用的性質,都是指向基礎類型變量的地址,即int型指針執行int類型變量的地址,double型指針指向double類型變量的地址,char型指針指向char類型變量的地址對于基礎的變量,我們可以書寫如下代碼:,接下來我們就來聊聊關于c語言指針深度講解?以下内容大家不妨參考一二希望能幫到您!

c語言指針深度講解(C語言初級.初識指針)1

c語言指針深度講解

指針為C語言中一種數據類型,它是一種用以存放内存地址的特殊數據類型,指針類型和普通的int、double類型不同,它不是一個基礎類型,而是與C語言提供的基礎類型而形成的複合類型。比如基礎類型有int、double、char,它們所對應的指針類型分别為int型指針、double型指針和char型指針,這些指針都有一個通用的性質,都是指向基礎類型變量的地址,即int型指針執行int類型變量的地址,double型指針指向double類型變量的地址,char型指針指向char類型變量的地址。對于基礎的變量,我們可以書寫如下代碼:

圖1

相應地,可以定義這些類型的指針變量,如下:

圖2

這些指針類型變量在基礎類型之後使用了星号,這就表明所定義的類型為一指針類型。關于星号的位置問題,有人喜歡将星号靠近基礎類型書寫,比如上面的代碼中使用了這種寫法,也有人喜歡将星号靠近變量名稱書寫,下面代碼為對應的另一種書寫風格:

圖3

兩種類型的書寫方式沒有本質上的區别,代碼中保持書寫一緻即可。

指針類型與普通類型的變量一樣,也是支持進行初始化和賦值操作。以基礎類型int型為例,初始化一個變量為0的語句為:

圖4

但是,指針對應的“零值”是什麼?在C語言中,指針的“零值”使用特殊常量NULL表示,那麼其對應的初始化為“零值”的語句就可以這樣書寫:

圖5

對于變量的初始化,其值不一定都是“零值”,還有可能是普通的數值,比如,整型的100,浮點型的3.14等,一個整型指針也可以初始化為一個内存地址,這個内存地址準确地說應該是一個整型變量所在的内存地址。比如上述圖4代碼中a的地址,如何獲取變量所對應的内存地址呢?使用一個名稱為獲取地址的運算符&,它是一個一元操作符,其用法是将它放置在變量名稱之前,如&a,獲取變量a所對應的内存地址,使用下面的代碼,初始化pa指針為變量a的地址。

圖6

指針在初始化為合法的内存地址之前是非法的,其内容不可以直接訪問,隻有将指針的地址設置為一個合法的變量地址之後,便可以通過這個指針操作數據。根據指針的特殊性,它本身就是一個内存地址,我們可以通過printf函數并指定對應的轉換符%p來顯示這個内存地址,顯然,對于指針來說,隻顯示指針所指向的内存地址并不能顯示出指針的作用,與這個地址上所對應的數據相比,這個數據顯得比地址本身更為重要,因此,每一個基礎類型的指針都提供了通過反引用(dereference)訪問對應數值的功能,比如,上述pa指針若要訪問它指向的變量a中的數據,可以使用*pa的方式,如下圖代碼,分别顯示指針pa的值和指針pa指向的值。

圖7

指針類型的變量除了支持反引用操作符之外,還支持幾個常見的操作符:加号操作符( ),減号操作符(-),遞增操作符( ),遞減操作符(--),加賦值操作符( =),減賦值操作符(-=)和sizeof操作符。這些操作符對于普通的單個變量地址操作沒有實際意義(甚至使用反引用訪問非法地址會導緻程序異常),隻有在特定的環境下才可以使用,比如,訪問數組時,将指針指向第一個元素所對應的地址,之後就可以通過不同的偏移量實現訪問數組中不同位置的元素。

圖8

圖8中第21行代碼定義了一個4個元素的整型數組,第22行代碼将整型指針pAges指向了數組第一個元素的地址(這個元素的地址其實與數組ages的地址是同一個内存地址),第24行代碼通過反引用顯示了數組中的第一個元素(索引為0)的數值,之後第25行代碼對指針pAges執行了遞增操作,即pAges現在指向了數值中第2個元素,其數值為36;第27行代碼對指針pAges執行了加賦值操作,将指針向後移動了2個元素,指向了最後一個元素72。由于數組中的數據存放方式是連續的、線性的,當指針的類型确定之後,那麼對指針進行算術運算後,如果指針依舊在數組的合法範圍内,就可以得到一個新的指針及其對應的數值。

字符指針廣泛引用于字符串操作。通常在操作字符串時,首先會将指針指向這個字符串的首地址,之後依次通過移動指針,直至遇到字符串的終止操作符’\0’,這樣就訪問了字符串中的每一個字符,也稱為遍曆字符串。下面的例子使用這種方法實現将一個字符串的内容複制到另一個數組中,構成另一個字符串。

圖9

圖9中src字符串為源字符串,代碼第33-39行代碼将源字符串中的内容複制到數組dst中,并構成一個新的字符串。第33行代碼将字符指針指向源字符串首地址,第44行代碼将字符指針pDst指向數組dst首地址,之後使用一個while循環語句,在循環語句第35行代碼,判斷當前的pSrc指針所指向的字符是否為’\0’字符,如果結果為真的話,則終止整個循環語句,複制操作完成,否則一直執行代碼第36-38行,第36行代碼将pSrc指針指向的字符賦值給pDst指針所指向位置的字符,第37行代碼遞增pSrc字符指針,第38行代碼遞增pDst字符指針,即每執行一次賦值操作,源字符指針和目标字符指針都向後移動一個位置,直至源字符指針指向的字符值變為’\0’位置。

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved