国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

指針,數(shù)據(jù)存儲與調試《一探內存究竟》

不知名網(wǎng)友 / 2673人閱讀

摘要:有關內存文章目錄有關內存前言一指針初階指針大小指針類型解引用野指針成因未初始化越界指針指向的空間釋放規(guī)避局部地址檢查有效性指針運算整數(shù)指針指針關系運算時允許指向數(shù)組元素的指針與指向數(shù)組最后一個元素后面的那個內存位置

有關內存



前言

大體把握C語言后,要清楚C語言是一門偏底層的語言,因此就非常有必要來探究一下內存深處的樣子,修煉我們的內功,對此有更深層次的理解.


一、指針初階

指針就是變量,用來存放地址的變量。(存放在指針中的值被當做地址處理)

#include int main(){ int a = 10;//在內存中開辟一塊空間 int *p = &a;//這里我們對變量a,取出它的地址,可以使用&操作符。   //將a的地址存放在p變量中,p就是一個之指針變量。 return 0;}

1.指針大小

對于32位機器,有32根地址線,即有2^32個地址,可以操作4g的空間,筆者在下文對此有詳細的介紹
C語言整體把握

2.指針類型

既然不管何種類型指針大小都由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é),即地址變量類型決定了指針移動的距離

3.野指針

位置不可只的指針,使用起來極其危險也沒有意義

1.成因

1.未初始化

隨意定義指針

#include int main(){  int *p;//局部變量指針未初始化,默認為隨機值    *p = 20; return 0;}

2.越界

#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;}

3.指針指向的空間釋放

規(guī)避

初始化,不越界,釋放置為空( NULL),局部變量地址慎用,檢查有效性

局部地址

盡量不要在子函數(shù)中直接返回指針,由于作用域與生命周期的限定,出函數(shù)時指針所指向的空間已經(jīng)被銷毀.

檢查有效性
if(*p != NULL)//斷言,需引頭文件//條件不為真時報錯,對程序員十分友好assert(*p)

4.指針運算

1.±整數(shù)

結合上文,常用于指針與數(shù)組——函數(shù)等的結合

2.指針-指針

可以得到兩地址之間的元素個數(shù)

關系運算時:允許指向數(shù)組元素的指針與指向數(shù)組最后一個元素后面的那個內存位置的指針比較,但是不允許與指向第一個元素之前的那個內存位置的指針進行比較。

可以與數(shù)組越界后一位判定目的是否成立

5.二級指針

存放地址的指針

int c= 0int *p = &c;int **p = *p;

6.指針數(shù)組

存放指針的數(shù)組

arr數(shù)組里存放五個元素,每個元素都是int*類型int* arr[5]

有關棧幀

引圖可以當做引言,但不可視為棧幀,下期詳講

二、數(shù)據(jù)存儲

1.數(shù)據(jù)類型

char //字符數(shù)據(jù)類型short //短整型int //整形long //長整型long long   //更長的整形float //單精度浮點數(shù)double //雙精度浮點數(shù)

構造類型

  • 數(shù)組
  • 結構體 struct
  • 枚舉 enum
  • 聯(lián)合類型 union

指針類型

int* p;char* p;float* p;void* p;

2.整形在內存中的存儲

整形分配四個字節(jié)

00000000 00000000 00000000 00000000

內存中,對整形,存儲并使用的是他的二級制位的補碼

原碼,反碼,補碼

對于整數(shù)

原碼,反碼,補碼相同,都是它所對應的二進制

對于負數(shù)

原碼是其所對應二進制且最高位為1

10000000 00000000 00000000 00000000
  • 二進制中最高位為符號位,0正1負
  • 原碼:最高位符號位為1
  • 反碼:符號位不變,其他位按位取反
  • 補碼:反碼+1即為補碼
    原碼與補碼的轉化方法相同
    符號位不變 取反加一

2.大小端

大(小)端字節(jié)序

  • 大端(存儲)模式,是指數(shù)據(jù)的低位保存在內存的高地址中,而數(shù)據(jù)的高位,保存在內存的低地址中;
  • 小端(存儲)模式,是指數(shù)據(jù)的低位保存在內存的低地址中,而數(shù)據(jù)的高位,,保存在內存的高地址中。
  • 圖示十六進制排序應該為00 00 00 01,01卻在低地址中,即為小端

3.浮點數(shù)在內存中的存儲

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可以表示成下面的形式:

  • (-1)^S * M * 2^E
  • (-1)^s表示符號位,當s=0,V為正數(shù);當s=1,V為負數(shù)。
  • M表示有效數(shù)字,大于等于1,小于2。
  • 2^E表示指數(shù)位。
    舉例來說:
    十進制的5.0,寫成二進制是 101.0 ,相當于 1.01×2^2 。那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。十進制的-5.0,寫成二進制是 -101.0 ,相當于 -1.01×2^2 。那么,s=1,M=1.01,E=2。
  • 對于32位的浮點數(shù),最高的1位是符號位s,接著的8位是指數(shù)E,剩下的23位為有效數(shù)字M。

  • 對于64位的浮點數(shù),最高的1位是符號位S,接著的11位是指數(shù)E,剩下的52位為有效數(shù)字M。

    素材來源:比特科技B站開源素材
    存儲時,由于m大于1小于2,即必為1,存儲時將1省略,讀取時加入即可

E

科學計數(shù)法中,e可以為負數(shù),也就有了e存入內存時其真實值必須加一個中間數(shù),8位為127,11位為1023
例:2^10 E為10,存儲時 10+127=137
10001001

E的特殊情況

1.不全為0或不全為一

正常情況,只需減去中間值127(1023)得到真實值,存儲時m正常補齊即可

2.全為0

E等于1-127(或1023)即為真實值
表示一個無窮小的數(shù)
將M直接還原為0.xxxxxxx的小數(shù)

3.全為1

2的高次冪,是一個非常大的數(shù),表示±無窮

補充

無符號的char所對應圖示可以用于E的二進制展示

調試

探究底層時離不開調試,調試是一個優(yōu)質程序員必須掌握的技巧。文中多處引入調試圖例

調試常用
最常使用的幾個快捷鍵:

  • F5
    啟動調試,經(jīng)常用來直接跳到下一個斷點處。
  • F9
    創(chuàng)建斷點和取消斷點
    斷點的重要作用,可以在程序的任意位置設置斷點。
    這樣就可以使得程序在想要的位置隨意停止執(zhí)行,繼而一步步執(zhí)行下去。
  • F10
    逐過程,通常用來處理一個過程,一個過程可以是一次函數(shù)調用,或者是一條語句。
  • F11
    逐語句,就是每次都執(zhí)行一條語句,但是這個快捷鍵可以使我們的執(zhí)行邏輯進入函數(shù)內部(這是
    最長用的)。
  • CTRL + F5
    開始執(zhí)行不調試,如果你想讓程序直接運行起來而不調試就可以直接使用。

算數(shù)轉換

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

相關文章

  • 《Java編程思想》筆記01------一切都是對象

    摘要:一引用操縱對象在的世界里,一切都被視為對象。特點創(chuàng)建程序時,需要知道存儲在棧內所有數(shù)據(jù)的確切生命周期,以便上下移動堆棧指針。因為,指向同一塊內存空間除了通過對象引用靜態(tài)變量,我們還可以通過類直接引用靜態(tài)變量 一、引用操縱對象 在Java的世界里,一切都被視為對象。操縱的標識符實際上是對象的引用, 例如:遙控器與電視的關系。 可以在沒有對象關聯(lián)的情況下,擁有一個引用。沒有電視機,也可以擁...

    yuanxin 評論0 收藏0
  • 【PHP源碼學習】2019-03-18 復習前面的內容

    摘要:調用函數(shù)時,它將用戶釋放的內存塊連接到空閑鏈上。這個聯(lián)合體共占用字節(jié)。是數(shù)字,且順序遞增位置固定,如訪問是的元素,即,就直接訪問數(shù)組的第個位置即可即,這樣就不需要前面的索引數(shù)組。 baiyan 全部視頻:https://segmentfault.com/a/11... 原視頻地址:http://replay.xesv5.com/ll/24... 本筆記中部分圖片截自視頻中的片段,圖片版...

    lindroid 評論0 收藏0
  • c語言中常見的一些坑和一些細節(jié)(建議收藏)

    摘要:博主接下來將會整理一些語言中常見的問題和坑,再看博主解釋的時候可以自己思考一下變量的聲明和定義有什么區(qū)別答變量的定義為變量分配地址和存儲空間,變量的聲明不分配地址。指針操作超過了變量的作用域范圍如返回局部變量的地址。 博主接下來將會整理一些語言中常見的問題和坑,再看博主解釋的時候可以自己...

    jhhfft 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<