摘要:多維數(shù)組本質(zhì)上和一維數(shù)組沒區(qū)別,他的維數(shù)僅僅只是作為比例因子和偏移,拿來計算地址偏移用的,但是多級指針用數(shù)組訪問的時候,他的維數(shù)僅僅只做偏移用,他的過程是加偏移,解引用,加偏移,解引用。。。。
c語言中規(guī)定類型這樣一個事情,主要是出于一個怎樣的原因呢?
char short int long long longfloatdouble
常規(guī)主要的類型,就是上面的幾種類型
char? ????????類型常用于存儲字符數(shù)據(jù),數(shù)據(jù)寬度為8bit,唉?一個英文字符也是八個bit位就能存下,好像他這個設(shè)計很合理啊,但是呢,其實我們深究一下,他是不合理的,為啥呢,主要從兩方面來說明問題,在32位的pc機(jī)前提下討論。
1.你使用char類型在進(jìn)行參數(shù)傳遞的時候,它實際還是按4字節(jié)傳遞的,最主要的原因是為了適應(yīng)本機(jī)寬度的問題
2.對齊問題,我們所討論的對齊,都是要基于硬件的,硬件不支持的話一切都是扯,那么char類型的對齊方式是按1字節(jié)對齊的,好像計算機(jī)也是最小訪問一字節(jié)哈,但是問題就出在這里,cpu的最小對齊單位是word,也就是雙字,那就意味著,一字節(jié)的對齊方式,只是cpu為我們做了適當(dāng)?shù)奶幚?/p>
當(dāng)然,要出也是有的,就旦旦只是節(jié)省內(nèi)存,經(jīng)此而已。
float 也會默認(rèn)轉(zhuǎn)成 double 主要原因,一個是精度,一個是本機(jī)寬度
其他的幾個類型,就不再贅述了,相信你已經(jīng)悟到了!
c語言中有有符號無符號的這種說法,好像對于我們的認(rèn)知來說數(shù)確實是有正負(fù)的問題哈,很合理哈,但是問題就出在這里了,計算機(jī)怎么知道你是有符號還是無符號??計算機(jī)做加減法都僅僅只是做與或非操作而已,它并不能判斷你的數(shù)究竟有無符號,0xFFFFFFFF你能說他是正數(shù)還是負(fù)數(shù)??0xFFFFFFFF 與0x12345678你能直接說他誰大誰????這都是無法確定的,因為我無法確定你是把高位當(dāng)符號位看還是不當(dāng)符號位看,同樣計算機(jī)也是無法確定,那么在cpu的角度來說,0xFFFFFFFF -?0x12345678究竟結(jié)果是正是負(fù)?無法確定,所以cpu把他即當(dāng)無符號數(shù)也當(dāng)有符號數(shù),按無符號數(shù)的運(yùn)算結(jié)果設(shè)置CF位,按有符號數(shù)的結(jié)果設(shè)置OF位,這下應(yīng)該清楚為啥會有符號的說法了吧,其目的就是要讓編譯器能夠準(zhǔn)確無誤的選擇是使用根據(jù)OF位的進(jìn)行操作的匯編指令,還是選擇是使用根據(jù)CF位的進(jìn)行操作的匯編指令,總結(jié),c語言的符號設(shè)計是讓程序員顯示指導(dǎo),消除歧義。
他這個設(shè)計又是為了什么呢??說白了就是為了確定兩個事情,一個就是轉(zhuǎn)換數(shù)據(jù)寬度,一個就是轉(zhuǎn)換步長,轉(zhuǎn)換數(shù)據(jù)寬度就不再贅述了,轉(zhuǎn)換步長
int *A;int *B;int *C;
現(xiàn)在又三個指針變量,那么他們現(xiàn)在的步長都是4個字節(jié),現(xiàn)在我想讓他每次的步長是兩個字節(jié),那么可以把他轉(zhuǎn)換成 short* 類型,或者轉(zhuǎn)換從(char (*)[2])類型,都是可以的,這個就是強(qiáng)轉(zhuǎn)的意義
char * szp = “ABCDEF”;char szArr[] = "Hello World";
好像他倆沒啥區(qū)別嚯,
char * szp = “ABCDEF”;char szArr[] = "Hello World";//好像指針也可以通過數(shù)組的形式訪問szp[i];//好像數(shù)組也可以通過指針的形式訪問*(szArr + i);
這事怕也也干的多了,好像也沒啥問題,多級指針和多維數(shù)組好像也沒有問題哈,確實一維數(shù)組和一級指針在這樣的兩種訪問方式下確實是等價的,但是問題就出現(xiàn)在了多維數(shù)組和多級指針上
int***p;//用數(shù)組訪問p[i][j][k];----------------------int Arr[i][j][k];//用指針的形式訪問*(*(*(Arr + m) +n) + v);
好像是我們平時這么使用是沒啥問題哈,但是其實是他的本質(zhì)已經(jīng)發(fā)生變化了,事先說明一下。多維數(shù)組本質(zhì)上和一維數(shù)組沒區(qū)別,他的維數(shù)僅僅只是作為比例因子和偏移,拿來計算地址偏移用的,但是多級指針用數(shù)組訪問的時候,他的維數(shù)僅僅只做偏移用,他的過程是加偏移,解引用,加偏移,解引用。。。。而數(shù)組以指針方式訪問的時候,他的本質(zhì)其實還是比例因子加偏移,他的 * 取值操作符,壓根就沒有取值,僅僅只是給你看看,讓你比如那么慌,讓你更好理解你所訪問的值是哪個,僅此而已。
本人水平有限,有錯的地方希望各位大佬指正;
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/121135.html
Python在什么時候會生成pyc文件呢? ??事情大概是這樣的,之前我一直以為python文件在執(zhí)行過之后就會生成pyc文件,后來一次偶然情況下,發(fā)現(xiàn)還是自己too young too simple,在看過其他大神文章并且自己驗證之后,發(fā)現(xiàn)還是有點(diǎn)意思的,權(quán)當(dāng)沒事寫點(diǎn)文章吧。 什么是pyc文件呢? ??簡單來說,pyc文件就是Python的字節(jié)碼文件,我們都知道Python是一種全平臺的解釋性語...
摘要:啟動項目,驗證進(jìn)入到項目中的中的方法的類中,在方法上點(diǎn)擊啟動啟動報錯,查看報錯原因分析問題原因說明端口被占用了。解決方法修改的端口號,或者將端口的應(yīng)用的端口號修改了。再次啟動項目啟動成功,驗證項目,驗證成功 1.創(chuàng)建項目 打開IDEA,F(xiàn)ile->New->ProjectshowImg(https://segmentfault.com/img/bV22nr?w=523&h=225); ...
摘要:在本文的例子中,你將使用和創(chuàng)建一個功能型集群。第二步啟動你的服務(wù)是集群的服務(wù)。這可能需要一些時間來拉取鏡像并啟動。注將含有到的超鏈接。這些鏈接是不能正常工作的鏈接將嘗試連接到集群,而不會自動代理的集群??焖偈褂檬褂眠B接到驅(qū)動并運(yùn)行。 在本文的例子中,你將使用 Kubernetes 和 Docker 創(chuàng)建一個功能型Apache Spark集群。 你將使用Spark standalone模...
閱讀 1239·2021-11-25 09:43
閱讀 1348·2021-09-26 09:55
閱讀 2409·2021-09-10 11:20
閱讀 3376·2019-08-30 15:55
閱讀 1452·2019-08-29 13:58
閱讀 1179·2019-08-29 12:36
閱讀 2353·2019-08-29 11:18
閱讀 3417·2019-08-26 11:47