摘要:目錄前言題目題目題目題目前言在學(xué)習(xí)完語(yǔ)言的初階以及進(jìn)階以后我們需要一些習(xí)題來(lái)檢驗(yàn)自己的學(xué)習(xí)成果下面將以一些筆試題和面試題來(lái)分析。在題目的分析中如有錯(cuò)誤歡迎指正。
在學(xué)習(xí)完C語(yǔ)言的初階以及進(jìn)階以后,我們需要一些習(xí)題來(lái)檢驗(yàn)自己的學(xué)習(xí)成果,下面將以一些筆試題和面試題來(lái)分析。
在題目的分析中如有錯(cuò)誤,歡迎指正。
int main() { char arr[] = { 'a','b','c','d','e','f' }; printf("%d/n", sizeof(arr));//6 printf("%d/n", sizeof(arr + 0));//4/8 printf("%d/n", sizeof(*arr));//1 printf("%d/n", sizeof(arr[1]));//1 printf("%d/n", sizeof(&arr));//4/8 printf("%d/n", sizeof(&arr + 1));//4/8 printf("%d/n", sizeof(&arr[0] + 1));//4/8 //strlen函數(shù)輸入地址,找到0為止 printf("%d/n", strlen(arr));//隨機(jī)值b printf("%d/n", strlen(arr + 0));//隨機(jī)值b printf("%d/n", strlen(*arr));//錯(cuò)誤 printf("%d/n", strlen(arr[1]));//錯(cuò)誤 printf("%d/n", strlen(&arr));//隨機(jī)值b printf("%d/n", strlen(&arr + 1));//隨機(jī)值b-6 printf("%d/n", strlen(&arr[0] + 1));//隨機(jī)值b-1 return 0;}
sizeof是一個(gè)操作符,strlen是C語(yǔ)言庫(kù)函數(shù),接受的是一個(gè)地址
在前面我們知道數(shù)組名代表首元素地址,但是有例外,例如sizeof和數(shù)組直接使用時(shí),這時(shí)候數(shù)組名代表整個(gè)數(shù)組。
經(jīng)過(guò)我們分析可以知道
- arr直接使用代表整個(gè)數(shù)組,sizeof(arr)的值是6;
- arr+0是一個(gè)地址,所以sizeof(arr+0)的值是4或8,具體答案取決32或64平臺(tái)
- *arr是首元素a的引用,所以sizeof(*arr)的值是1;
- arr[0]也是首元素a,與上面相同,它的值也是1;
- &arr是一個(gè)地址,所以它的值是4或者8;
- &arr+1是一個(gè)地址,所以它的值是4或者8;
- &arr[0]+1也是一個(gè)地址,所以它的地址是4或者8;
具體答案是不是我們分析的那樣,用VS2019編譯器進(jìn)行驗(yàn)證
接下來(lái)分析strlen函數(shù)
我們知道strlen接受字符串地址,然后往后找到/0結(jié)束
但是我們?cè)陬}目中初始化時(shí)沒(méi)有給’/0’,這樣就會(huì)造成他會(huì)一直往后走找到結(jié)束標(biāo)志’/0’。
- arr是首元素地址,但是我們不知道結(jié)束的0在哪,所以長(zhǎng)度未知,設(shè)為len
- arr+0也是首元素地址,未知結(jié)束標(biāo)志在哪,長(zhǎng)度未知,并且和上一個(gè)長(zhǎng)度相同,也是len
- *arr是什么?它是首元素a,數(shù)值97,不是一個(gè)地址,所以會(huì)報(bào)錯(cuò)
- arr[1]是元素b,不是一個(gè)地址,也會(huì)報(bào)錯(cuò)
- &arr是一個(gè)地址,是整個(gè)元素地址,但是和首元素地址相同,所以它的值也是len
- &arr+1是一個(gè)地址,但是它不是第二個(gè)元素的地址,而是跳過(guò)了整個(gè)數(shù)組的地址,指向f后面一個(gè)元素地址,跳過(guò)了6個(gè)元素,所以它的值len-6
- &arr[0]+1是一個(gè)地址,這個(gè)才是指向了第二個(gè)元素地址,值是len-1
讓我們通過(guò)VS2019編譯器進(jìn)行驗(yàn)證
由于3,4兩行代碼會(huì)報(bào)錯(cuò)從而導(dǎo)致程序終止運(yùn)行,我們將它屏蔽掉,最右邊是運(yùn)行結(jié)果,這與我們的分析是一致的。
int main() { char arr[] = "abcdef"; printf("%d/n", sizeof(arr));//7 printf("%d/n", sizeof(arr + 0));//4/8 printf("%d/n", sizeof(*arr));//1 printf("%d/n", sizeof(arr[1]));//1 printf("%d/n", sizeof(&arr));//4/8 printf("%d/n", sizeof(&arr + 1));//4/8 printf("%d/n", sizeof(&arr[0] + 1));//4/8 printf("%d/n", strlen(arr));//6 printf("%d/n", strlen(arr + 0));//6 //printf("%d/n", strlen(*arr));//錯(cuò)誤 //printf("%d/n", strlen(arr[1]));//錯(cuò)誤 printf("%d/n", strlen(&arr));//6 printf("%d/n", strlen(&arr + 1));//隨機(jī) printf("%d/n", strlen(&arr[0] + 1));//5}
這題和上面題只是多了一個(gè)結(jié)束的0,在結(jié)果上略有不同。
所以它包含7個(gè)元素,這和上面的多了一個(gè)’/0’
所以sizeof(arr)的值是7
strlen函數(shù)我們知道了結(jié)束的標(biāo)志在哪里,所以可以輕松判斷字符串長(zhǎng)度
而&arr+1跳過(guò)了整個(gè)字符串,下一個(gè)’/0’是未知的,所以是隨機(jī)值
int main() { char* p = "abcdef"; printf("%d/n", sizeof(p));//4/8 printf("%d/n", sizeof(p + 1));//4/8 printf("%d/n", sizeof(*p));//1 printf("%d/n", sizeof(p[0]));//1 printf("%d/n", sizeof(&p));//4/8 printf("%d/n", sizeof(&p + 1));//4/8 printf("%d/n", sizeof(&p[0] + 1));//4/8 printf("%d/n", strlen(p));//6 printf("%d/n", strlen(p + 1));//5 //printf("%d/n", strlen(*p)); //printf("%d/n", strlen(p[0])); printf("%d/n", strlen(&p));//隨機(jī)值a printf("%d/n", strlen(&p + 1));//隨機(jī)值b printf("%d/n", strlen(&p[0] + 1));//5}
我們需要知道的是,這是一個(gè)常量字符串,一個(gè)cha* 的指針不可能包含整個(gè)字符串,它指向的是首元素a。也就是說(shuō)*p==a,p是首元素的地址。
我們知道sizeof(地址)的值是4或者8
p,p+1,&p,&p+1,&p[0]+1它們都是地址
*p和p[0]代表首元素a,所以所占空間是1
當(dāng)首元素的地址傳進(jìn)strlen函數(shù)時(shí),直到往后找到’/0’,由此我們可以判斷strlen§==6,strlen(p+1)==5;
這里需要注意的是,我們這里&p和上面一個(gè)題的&arr是兩個(gè)概念,&p是地址的地址,指針p的地址,與原來(lái)字符串?dāng)?shù)組關(guān)系不大了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119109.html
目錄 ??? 一,寫(xiě)在前面 二,為什么使用文件 1,原因 2,數(shù)據(jù)流 3,緩沖區(qū)(Buffer) 4,C語(yǔ)言中帶緩沖區(qū)的文件處理 5,文件類(lèi)型 6,文件存取方式 三,什么是文件 1,程序文件 ?2,數(shù)據(jù)文件 3,文件名 四,文件的打開(kāi)和關(guān)閉? 1,文件指針 ?2,文件的打開(kāi)和關(guān)閉 五,文件的順序讀寫(xiě) 1,功能 2,代碼實(shí)現(xiàn) 六,文件的隨機(jī)讀寫(xiě) 1,fseek 2,ftell 3,rewind 七,...
摘要:當(dāng)集合為空時(shí),稱(chēng)該二叉樹(shù)為空二叉樹(shù)。也就是說(shuō),如果一個(gè)二叉樹(shù)的層數(shù)為,且結(jié)點(diǎn)總數(shù)是,則它就是滿(mǎn)二叉樹(shù)。完全二叉樹(shù)完全二叉樹(shù)是效率很高的數(shù)據(jù)結(jié)構(gòu),完全二叉樹(shù)是由滿(mǎn)二叉樹(shù)而引出來(lái)的。 ...
摘要:本書(shū)主要圍繞一系列逐漸復(fù)雜的程序問(wèn)題,以及用以解決這些問(wèn)題的語(yǔ)言特性展開(kāi)講解。你不只學(xué)到的函數(shù)和結(jié)構(gòu),也會(huì)學(xué)習(xí)到它們的設(shè)計(jì)目的和基本原理。因此我們把精力集中在最有價(jià)值的地方。本書(shū)不僅是對(duì)模板的權(quán)威解釋?zhuān)冶緯?shū)還深入地介紹了其他一般的思想。 C++ 入門(mén)教程(41課時(shí)) - 阿里云大學(xué) C+...
摘要:索性經(jīng)過(guò)了這兩個(gè)月的學(xué)習(xí),暫時(shí)對(duì)語(yǔ)言有了初步的了解,有句話說(shuō)得好最大的恐懼是未知。所以,今天先立一個(gè)大目標(biāo),成為一個(gè)牛犢子怎么呢樣年月日晚編程目標(biāo)正在學(xué)習(xí)語(yǔ)言中,語(yǔ)言我聽(tīng)說(shuō)是各種編程語(yǔ)言的基石,我打算把它學(xué)懂學(xué)透。 ①自我介紹: ?????? 我現(xiàn)在是一名粉嫩嫩的大一新生,在高考結(jié)束之后的三...
閱讀 735·2023-04-25 19:43
閱讀 3981·2021-11-30 14:52
閱讀 3807·2021-11-30 14:52
閱讀 3871·2021-11-29 11:00
閱讀 3802·2021-11-29 11:00
閱讀 3904·2021-11-29 11:00
閱讀 3580·2021-11-29 11:00
閱讀 6182·2021-11-29 11:00