C語言指針基礎(chǔ)詳解
1.1:概述
1.1.1:內(nèi)存
內(nèi)存含義:
- 儲存器:用來存儲程序和數(shù)據(jù),輔助CPU進(jìn)行運(yùn)算處理的重要組成部分。
- 內(nèi)存:內(nèi)部存儲器,暫時(shí)存放程序/數(shù)據(jù)。
- 外存:外部儲存器,長時(shí)間保存程序/數(shù)據(jù)。
1.1.2:內(nèi)存
內(nèi)存地址:
- 可以理解為將內(nèi)存抽象成一個(gè)很大的一維數(shù)組。
- 編碼就是將內(nèi)存的每一個(gè)字節(jié)分配一個(gè)32位或者64位的編號。這個(gè)內(nèi)存編號我們就稱為地址
1.1.3:指針和指針變量
- 內(nèi)存中每一個(gè)字節(jié)都有一個(gè)編號,我們稱之為”地址“。
- 指針的實(shí)質(zhì)就是內(nèi)存的”地址“。地址就是指針,指針也就是地址。
- 指針是地址,而定義的指針變量是存放地址的變量。
1.2:指針基礎(chǔ)知識
1.2.1:指針變量的定義和使用
- 指針是一種數(shù)據(jù)類型,指針變量是一種存放地址編號的變量。
-‘*' 解引用操作符,表示指針?biāo)傅膬?nèi)存空間的具體內(nèi)容。
打印變量的地址:(用%p)
解引用操作符的運(yùn)用:
int * 代表了指針類型,p是定義的指針類型的變量,將a的地址賦給變量P,這是p中存的是a的地址編號,p就指向了a的空間,*P就表示a空間里的內(nèi)容,也就是a的值。
1.2.2:通過指針間接修改變量的值
前面我們提到了關(guān)于由const修飾的局部變量的修改,不可以通過賦值直接修改,這里我們介紹通過指針間接的修改變量的值。
當(dāng)直接修改由const修飾的常量時(shí),我們可以看出會發(fā)生錯(cuò)誤。
這時(shí)我們定義一個(gè)指針變量間接的修改局部變量的值是可以的!我們用個(gè)圖來輔助理解:
1.2.3:指針的大小
- sizeof() 測得是指針變量指向的儲存地址的大小。
- 在32位平臺,所有指針地址都是32位(4字節(jié))。
- 在64位平臺,所有指針地址都是64位(8字節(jié))。
1.2.4:空指針與野指針
- 空指針(NULL):主要用于給指針變量初始化,空指針是指向內(nèi)存地址編號為0的空間。int * P = NULL;
- 野指針:對我個(gè)人理解而言,對于野指針我理解為指向一個(gè)未知的空間,(通俗來講,就是我雖然知道這塊內(nèi)存的地址編號,但是我并不知道這塊內(nèi)存具體存放的是什么內(nèi)容)。下面我介紹兩野指針常見錯(cuò)誤。
①:任意數(shù)值賦值給野指針。
②:操作野指針指向的內(nèi)存區(qū)域。
1.2.4:萬能指針
這里我們不做詳細(xì)的介紹,void * 指針可以指向任意變量的內(nèi)存空間:
特別注意:我們在對萬能指針進(jìn)行操作時(shí),因?yàn)橄到y(tǒng)需要知道具體需要對幾個(gè)字節(jié)的內(nèi)容進(jìn)行操作,所以我們需要強(qiáng)轉(zhuǎn)成具體的指針類型。
1.2.5:const修飾的指針變量
const修飾指針變量時(shí),因const的位置不同,修飾的意義也有所不同,如下代碼:
對于p1 ,const可以理解為修飾的*p1,也就是修飾的空間的內(nèi)容,這時(shí)這塊空間的地址是可以重新賦值的,而內(nèi)容不可以!
對于p2,const修飾的是指針變量p2,也就是修飾的空間地址,所以這時(shí)可以對內(nèi)容進(jìn)行輔助,而不可以改變變量的地址!
注:在編寫程序時(shí),指針作為函數(shù)參數(shù)傳遞,如果對應(yīng)的內(nèi)存空間的值不會被修改,可以使用const修飾指針數(shù)據(jù)類型。
1.3:指針與數(shù)組
1.3.1:數(shù)組名
敲重點(diǎn):對一維數(shù)組來說,數(shù)組名是首元素地址,是一個(gè)常量??!,不可以修改,切記切記,對二維數(shù)組來說,此時(shí)數(shù)組名也是首元素地址,只不過此時(shí)的首元素不再只是一個(gè)元素,而是一個(gè)一維數(shù)組。
1.3.2:指針操作數(shù)組
其實(shí)博主覺得,用指針操作數(shù)組可讀性還是比較差,而且后續(xù)面對多維數(shù)組,用指針來操作數(shù)組比較麻煩,可讀性差。無奈博主學(xué)藝不精呀。
這里*(arr + i) 與arr[i]的效果一摸一樣,這里的知識點(diǎn)涉及到指針的加減運(yùn)算,見下一小節(jié)。
1.3.3:指針的加減運(yùn)算
(1) 加法運(yùn)算
指針計(jì)算絕對不是簡單的整數(shù)相加,這里與指針類型有關(guān):
- 如果是一個(gè)整型指針,那么+1的效果就是變化一個(gè)int的大小。
- 如果是一個(gè)字符型指針,那么+1的效果就是變化一個(gè)char的大小。
此時(shí)數(shù)組名是首元素1的地址,屬于整型指針,+2表示變化2個(gè)int的大小,也就是第三個(gè)元素的地址。
(2) 減法運(yùn)算
這里對于指針減一個(gè)整數(shù)的作用與加法如出一轍,也是與指針類型有關(guān)。
這里我們利用一個(gè)逆序打印數(shù)組來說明指針減法,特別注意 arr與&arr分別+1的區(qū)別,arr表示的是首元素地址,&arr表示的是整個(gè)數(shù)組的地址,arr + 1變化4字節(jié),而&arr + 1 變化的是整個(gè)數(shù)組大小的字節(jié)數(shù)(36)。如圖:
我們可以看出,打印&arr與arr的地址編號是一樣的,但是意義是不一樣的。 1.3.4:指針數(shù)組
指針數(shù)組還是一個(gè)數(shù)組,數(shù)組元素都是指針類型,拿一級指針數(shù)組舉例:
這里博主提一點(diǎn)自己對一級指針數(shù)組的理解,希望對大家有一丟丟幫助,一級指針數(shù)組我把它與二級指針、二維數(shù)組相對應(yīng),這里不做詳細(xì)解釋,后續(xù)指針強(qiáng)化我會解釋我的理解,這種理解可能按官方說法來說不嚴(yán)謹(jǐn),但是能幫助我們理解就好。
1.4:指針基礎(chǔ)小結(jié)
- int i:定義整型變量
- int * p:定義一個(gè)指向int的指針變量
- int **p:定義一個(gè)二級指針,指向一級指針。
- int arr[10]:定義一個(gè)有10個(gè)整型元素的數(shù)組。
- int *arr[10]:定義一個(gè)有10個(gè)一級指針元素的數(shù)組。
1.5:總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語言實(shí)現(xiàn)清空指定文件夾中所有文件的方法
這篇文章主要介紹了C語言實(shí)現(xiàn)清空指定文件夾中所有文件的方法,實(shí)例分析了C語言實(shí)現(xiàn)文件刪除的相關(guān)技巧,需要的朋友可以參考下2015-06-06C++類中隱藏的幾個(gè)默認(rèn)函數(shù)你知道嗎
這篇文章主要為大家詳細(xì)介紹了C++類中隱藏的幾個(gè)默認(rèn)函數(shù),使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03詳解C語言中g(shù)etgid()函數(shù)和getegid()函數(shù)的區(qū)別
這篇文章主要介紹了詳解C語言中g(shù)etgid()函數(shù)和getegid()函數(shù)的區(qū)別,注意getegid只返回有效的組識別碼,需要的朋友可以參考下2015-08-08C++實(shí)現(xiàn)數(shù)組的排序/插入重新排序/以及逆置操作詳解
將新的數(shù)字與已經(jīng)排序好的數(shù)組中的數(shù)字一一比較,直到找到插入點(diǎn),然后將插入點(diǎn)以后的數(shù)字都向后移動(dòng)一個(gè)單位(a[i+1]=a[i]),然后將數(shù)據(jù)插入即可2013-10-10