C語言sizeof和strlen的指針和數(shù)組面試題詳解
一、概念
sizeof:
sizeof操作符的結(jié)果類型為size_t,(它在頭文件用typedfe定義為unsigned int類型),計(jì)算的是分配空間的實(shí)際字節(jié)數(shù)。sizeof是運(yùn)算符,可以以類型、函數(shù)、做參數(shù) 。
strlen:
strlen結(jié)果類型也為size_t(size_t strlen( const char *string )),但strlen是計(jì)算的空間中字符的個數(shù)(不包括‘\0’)。strlen是函數(shù),只能以char*(字符串)做參數(shù)。而且,要想得到的結(jié)果正確必須包含 ‘\0’(通過strlen的實(shí)現(xiàn)得知)。
二、例題及解析
首先我們需要知道數(shù)組名的意義:
1.sizeof(數(shù)組名),這里的數(shù)組名表示整個數(shù)組,計(jì)算的是整個數(shù)組的大小。
2.&數(shù)組名,這里的數(shù)組名表示整個數(shù)組,取出的是整個數(shù)組的地址。
3.除此之外所有的數(shù)組名都表示首元素的地址。
2.1 一維數(shù)組
int a[] = { 1,2,3,4 }; printf("%d\n", sizeof(a)); //16 a是整個數(shù)組的大小,sizeof計(jì)算出結(jié)果為16字節(jié) printf("%d\n", sizeof(a+0)); //4 a是首元素的地址 printf("%d\n", sizeof(*a)); //4 首元素地址的解引用 printf("%d\n", sizeof(a+1)); //4 2的地址 printf("%d\n", sizeof(a[1])); //4 printf("%d\n", sizeof(&a)); //4 &a數(shù)組的地址,4個字節(jié) printf("%d\n", sizeof(*&a)); //16 *和&抵消 printf("%d\n", sizeof(&a+1)); //4 4個字節(jié)的地址,跳過了4 printf("%d\n", sizeof(&a[0])); //4 printf("%d\n", sizeof(&a[0]+1)); //4 //總結(jié): 只要是地址,不論什么類型,大小都為4個字節(jié)
2.2 字符數(shù)組
char arr[] = { 'a','b','c','d','e','f' }; printf("%d\n", sizeof(arr)); //6 printf("%d\n", sizeof(arr+0)); //4 首元素地址為4個字節(jié) printf("%d\n", sizeof(*arr)); //1 printf("%d\n", sizeof(arr[1])); //1 printf("%d\n", sizeof(&arr)); //4 printf("%d\n", sizeof(&arr+1)); //4 printf("%d\n", sizeof(&arr[0]+1)); //4 printf("%d\n", strlen(arr)); //隨機(jī)值 strlen要找到\0才能返回?cái)?shù)據(jù)的長度 printf("%d\n", strlen(arr+0)); //隨機(jī)值 printf("%d\n", strlen(*arr)); //err strlen(a)會把a(bǔ)的ASCII碼值97當(dāng)作地址往后找 printf("%d\n", strlen(arr[1])); //err printf("%d\n", strlen(&arr)); //隨機(jī)值 printf("%d\n", strlen(&arr+1)); //隨機(jī)值 printf("%d\n", strlen(&arr[0]+1)); //隨機(jī)值
char arr[] = "abcdef"; printf("%d\n", sizeof(arr)); //7 arr是數(shù)組的地址 printf("%d\n", sizeof(arr + 0)); //4 arr是首元素的地址 printf("%d\n", sizeof(*arr)); //1 printf("%d\n", sizeof(arr[1])); //1 printf("%d\n", sizeof(&arr)); //4 數(shù)組的地址 4個字節(jié) printf("%d\n", sizeof(&arr + 1)); //4 printf("%d\n", sizeof(&arr[0] + 1)); //4 printf("%d\n", strlen(arr)); //6 printf("%d\n", strlen(arr + 0)); //6 printf("%d\n", strlen(*arr)); //err printf("%d\n", strlen(arr[1])); //err printf("%d\n", strlen(&arr)); //6 printf("%d\n", strlen(&arr + 1)); //隨機(jī)值 printf("%d\n", strlen(&arr[0] + 1)); //5
char *p = "abcdef"; printf("%d\n", sizeof(p)); //4 p是指針變量,求指針變量的大小,為4個字節(jié) printf("%d\n", sizeof(p + 1)); //4 p+1為b的地址 printf("%d\n", sizeof(*p)); //1 printf("%d\n", sizeof(p[0])); //1 printf("%d\n", sizeof(&p));; //4 指針p的地址 printf("%d\n", sizeof(&p + 1)); //4 printf("%d\n", sizeof(&p[0] + 1)); //4 b的地址 printf("%d\n", strlen(p)); //6 printf("%d\n", strlen(p + 1)); //5 printf("%d\n", strlen(*p)); //err strlen需要傳入地址 printf("%d\n", strlen(p[0])); //err printf("%d\n", strlen(&p)); //隨機(jī)值 printf("%d\n", strlen(&p + 1)); //隨機(jī)值 printf("%d\n", strlen(&p[0] + 1)); //5 從b開始數(shù)
2.3 二維數(shù)組
int a[3][4] = { 0 }; printf("%d\n", sizeof(a)); //48 二維數(shù)組中sizeof(a),a同樣表示整個數(shù)組 printf("%d\n", sizeof(a[0][0])); //4 printf("%d\n", sizeof(a[0])); //16 a[0]可看作第一行的數(shù)組名,sizeof(數(shù)組名)計(jì)算第一行數(shù)組大小 printf("%d\n", sizeof(a[0] + 1)); //4 a[0]表示第一行首元素地址,即a[0][0]地址,再+1為a[0][1]地址 printf("%d\n", sizeof(*(a[0] + 1))); //4 printf("%d\n", sizeof(a + 1)); //4 a為第一行一維數(shù)組的地址,+1為第二行的地址 printf("%d\n", sizeof(*(a + 1))); //16 第二行地址的解引用,是數(shù)組指針的解引用,訪問的是一個數(shù)組的大小 printf("%d\n", sizeof(&a[0] + 1)); //4 第一行地址+1,得第二行地址 printf("%d\n", sizeof(*(&a[0] + 1))); //16 第二行的大小 printf("%d\n", sizeof(*a)); //16 第一行地址解引用是第一行的大小 printf("%d\n", sizeof(a[3])); //16 計(jì)算第四行的大小(即使沒有第四行)
三、總結(jié)
這些都是來自往年的筆試題,非常重要!?。W(xué)廢了嗎?!
建議收藏反復(fù)閱讀思考,加深對指針、數(shù)組和內(nèi)存的理解?。。?/p>
到此這篇關(guān)于C語言sizeof和strlen的指針和數(shù)組面試題詳解的文章就介紹到這了,更多相關(guān)C語言 指針和數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語言strlen,strcpy,strcmp,strcat,strstr字符串操作函數(shù)實(shí)現(xiàn)
- C語言之sizeof與strlen的使用及區(qū)別
- C語言數(shù)組長度的計(jì)算方法實(shí)例總結(jié)(sizeof與strlen)
- 淺談C語言中的sizeof()和strlen()的區(qū)別
- C語言strlen函數(shù)實(shí)現(xiàn)讀取字符串長度詳解
- C語言?模擬實(shí)現(xiàn)strlen函數(shù)詳解
- 一篇文章教你如何用C語言實(shí)現(xiàn)strcpy和strlen
- C語言基礎(chǔ) strlen 函數(shù)
- C語言strlen函數(shù)全方位講解
相關(guān)文章
C++11中std::declval的實(shí)現(xiàn)機(jī)制淺析
這篇文章主要給大家介紹了關(guān)于C++11中std::declval實(shí)現(xiàn)機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-07-07C++中bitset位圖介紹及模擬實(shí)現(xiàn)
位圖就是用每一位來存放某種狀態(tài),適用于海量數(shù)據(jù),本文就介紹一下C++中bitset位圖介紹及模擬實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-07-07