C語言基礎(chǔ)掌握之day4

指針

&:求址符。
*:求值符。
&i:表示變量i的內(nèi)存地址。
*p:表示指針變量指向內(nèi)存的值。
*p=100:表示把100賦值給指針p指向的內(nèi)存空間。
指針只能存放地址。
int *p=NULL是允許的,表示指向地址為0的內(nèi)存區(qū)域,該區(qū)域是不能操作的。我們稱這樣的指針為空指針,意味著該指針不指向任何變量。
野指針:沒有賦初值,也稱之為懸空指針。野指針很難控制的,因為你不知道它會指向哪個地址空間,所以要初始化。賦NUll也可以,這樣就成了空指針。
用戶進程之間不能互相訪問對方的內(nèi)存空間。
內(nèi)核進程之間的內(nèi)存是可以互相自由的訪問。
void *p:表示無類型指針??梢越邮苋魏晤愋蛿?shù)據(jù)的地址,也可以將自己賦給任何數(shù)據(jù)類型的指針(在C語言中可以,在C++中是非法的,必須要轉(zhuǎn)類型)。同時void也意味著讀取的長度不確定。無法讀取一個數(shù)據(jù)。

指針與數(shù)組

數(shù)組名代表數(shù)組的首地址。
地址用8位十六進制數(shù)表示(8/2=4),因為指針是存放別人的地址,所以指針的大小應該是四個字節(jié)。
無論是int 類型的指針,還是char類型的指針,它們都在內(nèi)存中占4個字節(jié),類型只是決定了它們指向的數(shù)據(jù)類型和讀取的長度。
&數(shù)組名表示數(shù)組的首地址,同數(shù)組名一樣。
指針的運算并不是拿地址進行運算,而是指針在內(nèi)存中的移動。
一個內(nèi)存單元,存放兩位16進制數(shù)的數(shù)據(jù),也就是一個字節(jié),也就是說內(nèi)存單元存儲數(shù)據(jù)的最小單位是字節(jié)。
小端對齊:低地址放低位,高地址放高位。

指針變量p++表示向后移動一個類型長度的內(nèi)存,*p++表示先取值后移動。

在C語言中,數(shù)組名是一個常量(地址),值是不可以改變的。如array++這樣是不可以的。允許通過運算賦值給變量,如指針變量p=array+1表示指針p指向了數(shù)組的第二個元素。?
指針p[i]這樣是允許的,等價于array[i]。

指針數(shù)組

如char *s[10];表示數(shù)組里面的元素是指針。所以sizeof(s)=40;

數(shù)組指針

如 char (*s)[10];表示指向數(shù)組的指針,同時也意味著*s充當數(shù)組名。

二級指針(指向指針的指針)

在程序我們用到的指針對多是三級指針。

指針變量作為函數(shù)的參數(shù)

可以利用指針指向?qū)崊⒆兞康刂返奶攸c,改變實參變量的值。

一維數(shù)組作為函數(shù)的參數(shù)

當數(shù)組作為函數(shù)的參數(shù)時,C語言將數(shù)組名解釋為指針,所以sizeof(數(shù)組名)就會等于4個字節(jié)。當數(shù)組名作為函數(shù)參數(shù)傳遞給被調(diào)用函數(shù)時,被調(diào)用函數(shù)是不知道數(shù)組有多少元素。
相當于傳遞是一個地址,那么就可以通過地址來修改實參的值。

二維數(shù)組與指針

array表示二維數(shù)組名,那么*array就表示二維數(shù)組的首地址,這與一維數(shù)組有本質(zhì)的區(qū)別。
array表示二維數(shù)組名,那么array+1表示的是第一行、第零列的元素。那么array[0]+1表示第零行、第一列的元素。可以這么理解:二維數(shù)組是由多行的一位數(shù)組組成,那么它的組成單位就是一維數(shù)組,所以以二維數(shù)組名為代表的地址,長度就是一個一維數(shù)組,移動也只能以一維數(shù)組為單位地移動。那么一維數(shù)組是由元素組成,以一維數(shù)組名為代表的地址,長度就是一個元素大小,移動也只能移動以一個元素為單位地移動。
假如有一個二維數(shù)組array[3][4],那么我們用指針*p=array[3][4],*(p+1)只能一個個的遍歷。我們要想一行一行的遍歷,可以定義一個數(shù)組指針(*p)[4],(數(shù)組指針的定義:指向數(shù)組的指針)這樣就可以表示數(shù)組類型的指針,以4個元素為一個長度單位,*p可以表示數(shù)組名,同時也代表該地址的首地址。那么要想利用這樣的數(shù)組指針遍歷二維數(shù)組,就可以這樣寫*(*(p+i)+j),+i是代表向后移動一個行,+j是代表向后移動一個元素,也就是等價于array[i][j]。
二維數(shù)組可以看成一維數(shù)組的集合,所以可以定義一個數(shù)組指針表示指向數(shù)組的指針。


常量指針

const char *p;//定義一個指向常量的指針,通過指向常量的指針,可以限制指針修改一個變量的值。常量指針是值不能改變

指針*p可以分為兩部分看,第一部分:p表示指針變量,存放的是地址。第二部分*p表示的變量存放地址的值。

指針常量

char *const p;//定義一個指針是常量,一旦初始化,就不能再指向別的地址,這個就是常量的意義所在。
指針常量也稱常指針。指針常量是地址不能改變。

const 關(guān)鍵字保護數(shù)組內(nèi)容

如果將一個數(shù)組作為函數(shù)的形參傳遞,那么數(shù)組內(nèi)容可以在被調(diào)用函數(shù)內(nèi)部修改,有時候不希望這樣的事情發(fā)生,所以要對形參采用const參數(shù)。
如:func(const int array[])


指針作為函數(shù)的返回值

如:char *func()

指向函數(shù)的指針

指針可以指向變量、數(shù)組、也可以指向函數(shù)。
一個函數(shù)在編譯的時候會分配一個入口地址,這個入口地址就是函數(shù)的指針,函數(shù)名稱就代表函數(shù)的入口地址。
指向函數(shù)的指針的定義:void(*p)(int );表示定義了一個指向了一個有一個int類型的參數(shù),返回值是void類型的函數(shù)的指針。
指向函數(shù)的指針賦值:p=func3;表示讓p指向func3函數(shù)的入口地址,可以通過該指針來調(diào)用這個函數(shù)。

函數(shù)指針可以作為另外一個函數(shù)的參數(shù)

函數(shù)指針也就是指向函數(shù)的指針。
函數(shù)指針可以作為另外一個函數(shù)的參數(shù)來調(diào)用所指的函數(shù)。該過程稱為回調(diào)函數(shù),這是C語言特別高級的應用。
單線程:程序只能順序執(zhí)行。
多線程:程序并發(fā)執(zhí)行。



字符串指針

char *p="hello world";含義是指針p指向了字符串常量,常量區(qū)的內(nèi)容是不能被修改的。如果要改變常量的值就是非法操作,程序就會報錯。常量只讀。

漢字的ASCII值是負數(shù)。

指針數(shù)組作為main函數(shù)的形參

如:int main(int argc, char *argv[]):第一個參數(shù)就是告訴程序,第二個參數(shù)有多少個元素。
指針數(shù)組表示數(shù)組元素是指針的數(shù)組。char *argv[]相當于char **argv,那么char **argv表示指向char指針的指針。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,615評論 3 44
  • 一、框架 1、Mac系統(tǒng)及常用工具、進制;C數(shù)據(jù)類型、常量變量、運算符、表達式、格式化輸入輸出 2、關(guān)系運算符、邏...
    師景福閱讀 837評論 0 2
  • C語言大總結(jié) 一、基礎(chǔ): 1、進制、位權(quán)、1字節(jié)等于8位(位是計算機的最小儲存單位,字節(jié)是計算機最小存儲單元)、十...
    霧中探雪閱讀 2,938評論 1 36
  • 一、傾聽時容易犯的錯誤 1、 急于下結(jié)論 2、 輕視當事人的問題 3、 干擾、轉(zhuǎn)移當事人的話題 4、 做道德或正確...
    語馨_f389閱讀 256評論 0 0
  • snowflake算法是twitter提出的一個用來生成不重復ID的算法,用于解決ID沖突。適用于:先插數(shù)據(jù),然后...
    天一閣圖書管理員閱讀 978評論 1 1

友情鏈接更多精彩內(nèi)容