網(wǎng)站首頁 編程語言 正文
1.指針是什么(可能有點(diǎn)難理解)
指針的是啥?
指針實(shí)際上就是地址,地址就是系統(tǒng)給定的編號(hào),編號(hào)就是一個(gè)個(gè)內(nèi)存單元。
在某種情況來說指針=地址=編號(hào)=內(nèi)存單元。
指針就是地址,顧名思義,就是可以用來尋找目標(biāo)的。
所以指針變量就是存放地址的變量。
當(dāng)然我們口頭上常說的指針就是指針變量~
那指針是怎么產(chǎn)生的呢,也就是說內(nèi)存是怎樣產(chǎn)生的呢?
我們知道我們的計(jì)算機(jī)就是32位或64位系統(tǒng)組成,這32與64在物理上就是32根物理電線或64根物理電線組成。這物理電線通電時(shí),就會(huì)產(chǎn)生高電頻,從而產(chǎn)生電信號(hào),再由電信號(hào)轉(zhuǎn)變?yōu)閿?shù)字信號(hào),在我們計(jì)算機(jī)上就顯示數(shù)字信號(hào),我們知道計(jì)算機(jī)只能識(shí)別二進(jìn)制系列數(shù)字,所以這就最終變?yōu)?與0組成的數(shù)字信號(hào)。最終就有二的三十二或六十四次方的存儲(chǔ)空間,經(jīng)過換算,也就是4或8個(gè)GB,也就是內(nèi)存,當(dāng)然這些都是有硬件決定的。
而指針的大小也就是4個(gè)字節(jié)或八個(gè)字節(jié)組成(與指針的類型無關(guān))
原理:指針的大小由系統(tǒng)決定,比如32位系統(tǒng),就由32給比特位組成,
比如00000000000000000000000000000001
也就是4個(gè)字節(jié)~
也就是說無論是char類型還是int類型指針大小都是4或8(在64位系統(tǒng)上)個(gè)字節(jié)。
2. 指針和指針的類型
int a=10;
int* pa=&a;? ? ?//此時(shí)int*就是指針pa的類型,而pa就是指針變量,來儲(chǔ)存地址的~
指針類型分很多種如int,float,double等;
既然大小都是四個(gè)字節(jié),那為什么要區(qū)分不同類型的指針呢?
這就要說到指針類型的特點(diǎn):
1.指針類型決定解引用時(shí)訪問幾個(gè)字節(jié);一個(gè)int類型指針就直接訪問4給字節(jié)的空間,一個(gè)char類型就只能訪問一個(gè)空間的內(nèi)存等等
2.指針類型決定了指針向前一步或向后一步能走多遠(yuǎn)的距離。就比如說int類型的指針加一個(gè)單位就相當(dāng)于走了四個(gè)字節(jié)的空間。
從圖上就可以看到,當(dāng)指針變量的類型是int型時(shí),指針變量加一,地址就變了四個(gè)字節(jié)的,當(dāng)指針是char類型的時(shí)候,指針變量加一就變成跳過一個(gè)字節(jié)的單位了。
可以連續(xù)定義多個(gè)指針如:
int*pa,*pb;
(并不是int*pa,pb);
3.野指針
所謂野指針就是沒有地址的指針,系統(tǒng)就會(huì)出現(xiàn)錯(cuò)誤,都是造成野指針的情況下,系統(tǒng)往往都不會(huì)報(bào)錯(cuò),都不能說明,野指針就是正確的,就比如說,一個(gè)小偷,沒被進(jìn)警察抓到就能說明他的行為是對(duì)的嗎?回答是,當(dāng)然不能。
雖然最終程序依然可以運(yùn)行,但是最終的結(jié)果并不會(huì)是預(yù)期的那樣。這時(shí)候就占用了一塊未申請(qǐng)的空間了。這塊空間的內(nèi)容是隨機(jī)的。
那野指針是怎樣造成的呢?怎樣避免野指針的發(fā)生呢?
造成原因:
1.由于指針未定義,就開始使用。
比如:
? ? ? ? ? int*p;
? ? ? ? ? *p=20;
2.指針的越界訪問,這常常體現(xiàn)在數(shù)組里。
這就出現(xiàn)溢出的情況了~
3.指針指向的空間釋放,在函數(shù)中很常見。
既然出現(xiàn)了野指針,那有什么辦法可以避免野指針的出現(xiàn)呢?
解決方案
1.給指針初始話
2.小心指針越界
3.指針指向的空間釋放后,及時(shí)定位NULL,防止被再次使用。
4.避免返回局部變量地址。
5.指針使用前先檢測(cè)有效性。
4.指針的運(yùn)算
4.1 指針的加減整數(shù)的運(yùn)算
指針加減一個(gè)整數(shù),地址就會(huì)有相應(yīng)的變化;
4.2 指針-指針
這里的指針-指針,最終的結(jié)果是中間的元素個(gè)數(shù)(而不是中間有幾個(gè)字節(jié))
幾個(gè)字節(jié)由指針的類型決定;
當(dāng)然,既然由減,肯定有人會(huì)問為什么沒加呢(問得好,下次別問了)
兩指針相減,得到的是兩個(gè)地址中間的元素個(gè)數(shù),那相加就沒有什么特別的含義了,所以不存在相加。
舉個(gè)例子
我們平時(shí)計(jì)算字符串的長度通常有三種方法(1.計(jì)數(shù)器 2.遞歸 3.就是指針-指針)
前兩種方法就不講了~? ? ? ? ? ? ? ? ?(前提是兩個(gè)指針是指向同一塊空間)
5.指針與數(shù)組
指針是地址,口頭上也就是指針變量~
數(shù)組是什么:數(shù)組就是相同類型數(shù)據(jù)的集合~
這似乎兩者沒什么關(guān)系,但是實(shí)際上我們可以通過指針來訪問數(shù)組。
事實(shí)證明:*(p+i)? ? *(arr+i)? ? arr[i]? ?p[i] 這四種情況的結(jié)果是相同的,都可以訪問元素
他們代表的意義是相同的!!!
6.二級(jí)指針
你可能會(huì)擔(dān)心很難(我指針都不懂,還二級(jí)指針,不看了)
別~~~~
其實(shí)二級(jí)與多級(jí)指針都很容易
二級(jí)指針指向的就是存放一級(jí)指針的地址(指針)
int main() { int a = 10; int* pa = &a; int** ppa = &pa;//ppa就是一個(gè)二級(jí)指針 **ppa = 20; printf("%d\n", a); //int*** pppa = &ppa;//pppa就是三級(jí)指針 return 0; }
7.指針數(shù)組
指針數(shù)組是數(shù)組還是指針呢?
答案是:數(shù)組,是用來存放指針的數(shù)組。
除了指針數(shù)組外,其實(shí)我們還學(xué)習(xí)了整形數(shù)組和浮點(diǎn)型數(shù)組;
比如:
int* arr[4]={&a,&b,&c,&d}
&a |
&b |
&c |
&d |
int arr[4]={a,b,c,d}
a |
b |
c |
d |
對(duì)比一下,是不是很容易理解了,數(shù)組就是裝有相同類型的數(shù)據(jù),而指針數(shù)組也一樣,只是里面裝的都是一個(gè)個(gè)指針,不要想的很難哦~
原文鏈接:https://blog.csdn.net/m0_64332179/article/details/121885220
相關(guān)推薦
- 2022-09-06 C語言超詳細(xì)講解指向函數(shù)的指針_C 語言
- 2022-05-28 利用For循環(huán)遍歷Python字典的三種方法實(shí)例_python
- 2022-02-18 RuntimeError: CUDA error: invalid device ordinal
- 2022-09-18 ASP.NET實(shí)現(xiàn)文件上傳功能_實(shí)用技巧
- 2022-03-14 事務(wù)隔離級(jí)別 在spring實(shí)戰(zhàn)
- 2022-05-24 flutter實(shí)現(xiàn)頭部tabTop滾動(dòng)欄_Android
- 2021-12-09 Typora自動(dòng)編號(hào)的具體操作_其它綜合
- 2022-10-11 Android Studio 編譯報(bào)錯(cuò)The minCompileSdk (32) specifie
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支