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