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