摘要:有關(guān)內(nèi)存文章目錄有關(guān)內(nèi)存前言一指針初階指針大小指針類型解引用野指針成因未初始化越界指針指向的空間釋放規(guī)避局部地址檢查有效性指針運(yùn)算整數(shù)指針指針關(guān)系運(yùn)算時(shí)允許指向數(shù)組元素的指針與指向數(shù)組最后一個(gè)元素后面的那個(gè)內(nèi)存位置
大體把握C語言后,要清楚C語言是一門偏底層的語言,因此就非常有必要來探究一下內(nèi)存深處的樣子,修煉我們的內(nèi)功,對此有更深層次的理解.
指針就是變量,用來存放地址的變量。(存放在指針中的值被當(dāng)做地址處理)
#include int main(){ int a = 10;//在內(nèi)存中開辟一塊空間 int *p = &a;//這里我們對變量a,取出它的地址,可以使用&操作符。 //將a的地址存放在p變量中,p就是一個(gè)之指針變量。 return 0;}
對于32位機(jī)器,有32根地址線,即有2^32個(gè)地址,可以操作4g的空間,筆者在下文對此有詳細(xì)的介紹
C語言整體把握
既然不管何種類型指針大小都由32位與64位決定,那不同的指針類型有什么作用呢?
char *pc = NULL;int *pi = NULL;short *ps = NULL;long *pl = NULL;float *pf = NULL;double *pd = NULL;
*(解引用操作符)可以對地址(指針)變量 解引用通過地址對其內(nèi)容做出修改
*pc = 10
#include int main(){ int n = 10; char *pc = (char*)&n; int *pi = &n; printf("%p/n", &n); printf("%p/n", pc); printf("%p/n", pc+1); printf("%p/n", pi); printf("%p/n", pi+1); return 0;}
經(jīng)過調(diào)試可以發(fā)現(xiàn)int類型一次跳過四個(gè)字節(jié),char類型一次跳過一個(gè)字節(jié),即地址變量類型決定了指針移動(dòng)的距離
位置不可只的指針,使用起來極其危險(xiǎn)也沒有意義
隨意定義指針
#include int main(){ int *p;//局部變量指針未初始化,默認(rèn)為隨機(jī)值 *p = 20; return 0;}
#include int main(){ int arr[10] = {0}; int *p = arr; int i = 0; for(i=0; i<=11; i++) { //當(dāng)指針指向的范圍超出數(shù)組arr的范圍時(shí),p就是野指針 *(p++) = i; } return 0;}
初始化,不越界,釋放置為空( NULL),局部變量地址慎用,檢查有效性
盡量不要在子函數(shù)中直接返回指針,由于作用域與生命周期的限定,出函數(shù)時(shí)指針?biāo)赶虻目臻g已經(jīng)被銷毀.
if(*p != NULL)//斷言,需引頭文件 //條件不為真時(shí)報(bào)錯(cuò),對程序員十分友好assert(*p)
結(jié)合上文,常用于指針與數(shù)組——函數(shù)等的結(jié)合
可以得到兩地址之間的元素個(gè)數(shù)
可以與數(shù)組越界后一位判定目的是否成立
存放地址的指針
int c= 0;int *p = &c;int **p = *p;
存放指針的數(shù)組
arr數(shù)組里存放五個(gè)元素,每個(gè)元素都是int*類型int* arr[5]
引圖可以當(dāng)做引言,但不可視為棧幀,下期詳講
char //字符數(shù)據(jù)類型short //短整型int //整形long //長整型long long //更長的整形float //單精度浮點(diǎn)數(shù)double //雙精度浮點(diǎn)數(shù)
int* p;char* p;float* p;void* p;
整形分配四個(gè)字節(jié)
00000000 00000000 00000000 00000000
內(nèi)存中,對整形,存儲(chǔ)并使用的是他的二級(jí)制位的補(bǔ)碼
原碼,反碼,補(bǔ)碼相同,都是它所對應(yīng)的二進(jìn)制
原碼是其所對應(yīng)二進(jìn)制且最高位為1
10000000 00000000 00000000 00000000
大(?。┒俗止?jié)序
3.1415926
1e10
int main(){ int n = 9; float *pFloat = (float *)&n; printf("n的值為:%d/n",n); printf("*pFloat的值為:%f/n",*pFloat); *pFloat = 9.0; printf("num的值為:%d/n",n); printf("*pFloat的值為:%f/n",*pFloat); return 0;}
與思考有所不同,不得不介紹浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)規(guī)則
///
根據(jù)國際標(biāo)準(zhǔn)IEEE(電氣和電子工程協(xié)會(huì)) 754,任意一個(gè)二進(jìn)制浮點(diǎn)數(shù)V可以表示成下面的形式:
科學(xué)計(jì)數(shù)法中,e可以為負(fù)數(shù),也就有了e存入內(nèi)存時(shí)其真實(shí)值必須加一個(gè)中間數(shù),8位為127,11位為1023
例:2^10 E為10,存儲(chǔ)時(shí) 10+127=137
10001001
正常情況,只需減去中間值127(1023)得到真實(shí)值,存儲(chǔ)時(shí)m正常補(bǔ)齊即可
E等于1-127(或1023)即為真實(shí)值
表示一個(gè)無窮小的數(shù)
將M直接還原為0.xxxxxxx的小數(shù)
2的高次冪,是一個(gè)非常大的數(shù),表示±無窮
無符號(hào)的char所對應(yīng)圖示可以用于E的二進(jìn)制展示
探究底層時(shí)離不開調(diào)試,調(diào)試是一個(gè)優(yōu)質(zhì)程序員必須掌握的技巧。文中多處引入調(diào)試圖例
調(diào)試常用
最常使用的幾個(gè)快捷鍵:
long doubledoublefloatunsigned long intlong intunsigned intint
不同算數(shù)類型進(jìn)行算數(shù)操作時(shí),數(shù)據(jù)由低到高進(jìn)行算數(shù)轉(zhuǎn)換
注意:轉(zhuǎn)換為char類型時(shí)要在二進(jìn)制位低八位處進(jìn)行截?cái)?,轉(zhuǎn)回時(shí)要將高位補(bǔ)為符號(hào)位.
重點(diǎn)在于數(shù)據(jù)存儲(chǔ),浮點(diǎn)數(shù)的存儲(chǔ),算數(shù)轉(zhuǎn)換.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/125658.html
摘要:一引用操縱對象在的世界里,一切都被視為對象。特點(diǎn)創(chuàng)建程序時(shí),需要知道存儲(chǔ)在棧內(nèi)所有數(shù)據(jù)的確切生命周期,以便上下移動(dòng)堆棧指針。因?yàn)?,指向同一塊內(nèi)存空間除了通過對象引用靜態(tài)變量,我們還可以通過類直接引用靜態(tài)變量 一、引用操縱對象 在Java的世界里,一切都被視為對象。操縱的標(biāo)識(shí)符實(shí)際上是對象的引用, 例如:遙控器與電視的關(guān)系。 可以在沒有對象關(guān)聯(lián)的情況下,擁有一個(gè)引用。沒有電視機(jī),也可以擁...
摘要:調(diào)用函數(shù)時(shí),它將用戶釋放的內(nèi)存塊連接到空閑鏈上。這個(gè)聯(lián)合體共占用字節(jié)。是數(shù)字,且順序遞增位置固定,如訪問是的元素,即,就直接訪問數(shù)組的第個(gè)位置即可即,這樣就不需要前面的索引數(shù)組。 baiyan 全部視頻:https://segmentfault.com/a/11... 原視頻地址:http://replay.xesv5.com/ll/24... 本筆記中部分圖片截自視頻中的片段,圖片版...
摘要:博主接下來將會(huì)整理一些語言中常見的問題和坑,再看博主解釋的時(shí)候可以自己思考一下變量的聲明和定義有什么區(qū)別答變量的定義為變量分配地址和存儲(chǔ)空間,變量的聲明不分配地址。指針操作超過了變量的作用域范圍如返回局部變量的地址。 博主接下來將會(huì)整理一些語言中常見的問題和坑,再看博主解釋的時(shí)候可以自己...
閱讀 3805·2023-01-11 11:02
閱讀 4308·2023-01-11 11:02
閱讀 3132·2023-01-11 11:02
閱讀 5240·2023-01-11 11:02
閱讀 4804·2023-01-11 11:02
閱讀 5578·2023-01-11 11:02
閱讀 5384·2023-01-11 11:02
閱讀 4084·2023-01-11 11:02