C:模块化程序设计 以及数组
模塊化:
舉例:
繼續(xù)細(xì)化上述模塊,猜完一個數(shù)字之后,繼續(xù)再猜:
再細(xì)化計算機(jī)生成數(shù)字:
??
數(shù)據(jù)類型前邊都加入了一個const,把他聲明為整形常量的原因,當(dāng)你這個參數(shù)被聲明為const的時候就可以起到保護(hù)參數(shù)的值不被改寫。而此處在這兩個函數(shù)內(nèi)部不需要改寫這兩個參數(shù)的值,只是判斷他倆對不對,所以此處假如const的好處,一旦你在這里邊被改寫了,被聲明為const的這個變量,編譯器編譯的時候就會報錯。所以他會起到一個保護(hù)需要不被改寫的數(shù)據(jù)不被改寫的這樣的一個作用。
數(shù)組
但是定義的時候不允許是變量。
如果數(shù)組元素的值沒有初始化,那么他的初始值同樣是隨機(jī)數(shù)。
沒有初始化的元素自動初始化為0。
有沒有更高效的初始化的方法呢?見下
初始化的方法:調(diào)用memset()函數(shù),把內(nèi)存當(dāng)中的內(nèi)存單元給他初始化為0。多少個單元初始化為0呢?我們用sizeof(a)計算數(shù)組a在內(nèi)存當(dāng)中占用的字節(jié)數(shù),把這些字節(jié)單元里邊的值都初始化為0值。高效的賦值方法:(一個數(shù)組的數(shù)值元素賦值給另外一個數(shù)組)調(diào)用memcpy()函數(shù)。把a(bǔ)數(shù)組元素中的值賦值給數(shù)組b元素。同樣要指定a數(shù)組元素當(dāng)中多少個字節(jié)的值來賦值給b。所以使用sizeof來獲取數(shù)組a所占用的內(nèi)存單元的字節(jié)數(shù)。
雖然二維數(shù)組表示幾行幾列,但是在內(nèi)存中也是線性存儲的。因為列數(shù)決定了偏移量是多大。
根據(jù)數(shù)組的類型,定義數(shù)組的時候要聲明它的類型,根據(jù)他的數(shù)據(jù)類型是決定在內(nèi)存當(dāng)中每一個數(shù)組元素占多少個字節(jié),數(shù)據(jù)類型前邊再加上存儲類型的話,說明是安排在靜態(tài)存儲區(qū)存儲呢還是動態(tài)存儲區(qū)存儲呢,這個時候是決定的編輯器為他分配的存儲區(qū)域。
首先定義一個字符型的數(shù)組,因為字符型的數(shù)組里邊的每一個元素只占用一個字節(jié)。
上述代碼中%p,是輸出a他在內(nèi)存當(dāng)中占的內(nèi)存單元的地址。起始地址。
\000是什么意思?這里邊的000是幾進(jìn)制的?如果是反斜杠就表示他是轉(zhuǎn)移字符,后面的三位數(shù)字代表他是一個8進(jìn)制的數(shù);上述數(shù)組每一行不是4列嗎?為什么只初始化了3個8進(jìn)制數(shù)呢?因為這是一個字符串,字符串后邊有一個結(jié)束標(biāo)志,這里邊沒有顯示出來,所以這里邊是一個字符串結(jié)束標(biāo)志。字符串結(jié)束標(biāo)志是一個ASCII碼為0的那一個字符,他這里邊沒有顯示。
對a[0][4]和a[1][0]賦值,這兩個實際指的是同一個元素,因為這個二維數(shù)組在內(nèi)存當(dāng)中也是線性存儲的,那么他的位置在哪里呢就是首地址加上偏移量。偏移量怎么算的呢?a[0][4]的偏移量就是0乘上他每一行的列數(shù)是4加上4等于4;a[1][0]是1乘上4加上0也是4。所以實際上他的偏移量是一樣的,指向的是同一個位置。
但是a[0][4]是越界的,但是寫出來是合法的,因為他不檢查下邊越界,所以寫出來還是合法的。
以前使用的是普通變量做函數(shù)參數(shù),現(xiàn)在可以向函數(shù)傳遞一個數(shù)組,數(shù)組做函數(shù)參數(shù)和普通變量做函數(shù)參數(shù)有什么區(qū)別呢?
普通變量做函數(shù)參數(shù)我們稱他為按值傳遞參數(shù),按值傳參就是把一個實參的副本,拷貝一份傳遞給形參,形參得到的只是實參的一個副本,所以實參和形參在內(nèi)存當(dāng)中是占不同的存儲單元的,二者是不會互相打架的。(形參值的改變不會影響實參,因為他們實參和形參在內(nèi)存中占不同的存儲單元,占的地址不同;就算同名也沒關(guān)系,因為地址不同。)
數(shù)組做函數(shù)參數(shù)就不是按值傳參了,稱他為按引用傳參。按引用傳參就是拷貝數(shù)組的地址值,來傳遞給形參。(如果拷貝一個地址值給形參和把這個數(shù)組的全部的元素值拷貝一份給這個形參,哪一個效率高啊?顯然傳遞一個地址效率高得多,你傳全部的數(shù)組元素效率要低啊,所以他的設(shè)計就是為了高效起見,傳一個地址值,傳遞一個地址值相當(dāng)于我這兩個小房子鑰匙我多配了一把給你,你也能進(jìn)去我也能進(jìn)去,那你修改了我就能看見了,對我就有影響了,那實參和形參數(shù)組他是占用同一個內(nèi)存單元,所以你這個形參數(shù)組的值改變了會影響到實參數(shù)組的值,這就是數(shù)組做函數(shù)參數(shù)和普通變量做函數(shù)參數(shù)的區(qū)別。)但是你說你這個形參在離開這個函數(shù)的時候被釋放了,被釋放了沒有關(guān)系啊,我這個實參呢,我的地址還在,我還能夠去訪問這個修改后的這個值。
排序算法:
總結(jié)
以上是生活随笔為你收集整理的C:模块化程序设计 以及数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C:内存中供用户使用的存储空间
- 下一篇: Ubuntu18.04:错误整理