數(shù)組:判斷是否到末尾和獲取size的思考
數(shù)組:(非char,非string)判斷是否到末尾:
? ? 這兩種方法一直都有被用到,直到我的遇到了一個(gè)明顯能進(jìn)去,但是死活進(jìn)不去的循環(huán)...人都給我整傻了!
? ? 沒錯(cuò),這個(gè)地方的第一項(xiàng)? ( 0 != '\0' ) 判定成了相等,所以沒進(jìn)去循環(huán)!我還特地嘗試了一下。如果存在疑問,用 if 去驗(yàn)證這個(gè)等式。所以此辦法遍歷數(shù)組失效了!
????但是問題又來了,如果使用sizeof()去統(tǒng)計(jì)空間大小,這個(gè)就和初始化數(shù)組的時(shí)候相關(guān)了。
????不指定數(shù)組大小的時(shí)候,就會(huì)默認(rèn)分配當(dāng)前需要的內(nèi)存大小,sizeof得出的空間大小也就是實(shí)際的大小。
????如果指定了大小,那么就會(huì)被分配指定的內(nèi)存,以上面的testNum2數(shù)組舉例,實(shí)際占用了6個(gè)數(shù)據(jù),但是統(tǒng)計(jì)出來時(shí)40個(gè)字節(jié),也就是10個(gè)int的大小。
????這個(gè)問題并非只有在int數(shù)組上體現(xiàn)。
數(shù)組:char :判斷是否到末尾:
字符串轉(zhuǎn)為char[]類型的時(shí)候,實(shí)際上編譯器做了一個(gè)限制!舉個(gè)例子:
這里給三個(gè)char數(shù)組的初始化:后兩個(gè)都分配了6個(gè)字節(jié),因?yàn)?字符串一定會(huì)存在一個(gè)'\0'作為字符串的結(jié)尾標(biāo)識(shí),所以實(shí)際大小會(huì)多一個(gè)。
????所以針對(duì)string可以放心的使用(str[i] != '\0') 作為末尾判定。但是 char[] 在數(shù)據(jù)存滿的情況下,使用 '\0' 判定會(huì)越界。?
????還有一點(diǎn):string使用const char[]實(shí)現(xiàn)的,所以? str[i] = 'x' ;? 這樣子的賦值語法不會(huì)生效,同時(shí)string直接轉(zhuǎn)為char[] 是不可以實(shí)現(xiàn)的。需要自己去遍歷str給char[]賦值。
????所以一個(gè)很矛盾的點(diǎn)在于,其他類型(非string)的數(shù)組使用 “是否等于‘\0’來判斷”是不合理的。但是使用sizeof去統(tǒng)計(jì)字節(jié)的方式,往往不是這個(gè)數(shù)組實(shí)際存儲(chǔ)數(shù)據(jù)的長(zhǎng)度(很多時(shí)候我們是需要定義一個(gè)大的數(shù)組去應(yīng)對(duì)一個(gè)未知的數(shù)據(jù))
????所以對(duì)于長(zhǎng)度不確定,并存在0的int數(shù)組,我們沒有辦法用sizeof或者!='\0'的方法直接獲取實(shí)際有效長(zhǎng)度。可以把非數(shù)據(jù)部分寫為沒有意義的一個(gè)數(shù),以此作為判斷結(jié)尾的標(biāo)志。
還有一點(diǎn):string類型需要使用size()方法。