C語言sizeof和strlen的指針和數(shù)組面試題詳解
一、概念
sizeof:
sizeof操作符的結果類型為size_t,(它在頭文件用typedfe定義為unsigned int類型),計算的是分配空間的實際字節(jié)數(shù)。sizeof是運算符,可以以類型、函數(shù)、做參數(shù) 。
strlen:
strlen結果類型也為size_t(size_t strlen( const char *string )),但strlen是計算的空間中字符的個數(shù)(不包括‘\0’)。strlen是函數(shù),只能以char*(字符串)做參數(shù)。而且,要想得到的結果正確必須包含 ‘\0’(通過strlen的實現(xiàn)得知)。
二、例題及解析
首先我們需要知道數(shù)組名的意義:
1.sizeof(數(shù)組名),這里的數(shù)組名表示整個數(shù)組,計算的是整個數(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計算出結果為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
//總結: 只要是地址,不論什么類型,大小都為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)); //隨機值 strlen要找到\0才能返回數(shù)據(jù)的長度
printf("%d\n", strlen(arr+0)); //隨機值
printf("%d\n", strlen(*arr)); //err strlen(a)會把a的ASCII碼值97當作地址往后找
printf("%d\n", strlen(arr[1])); //err
printf("%d\n", strlen(&arr)); //隨機值
printf("%d\n", strlen(&arr+1)); //隨機值
printf("%d\n", strlen(&arr[0]+1)); //隨機值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)); //隨機值
printf("%d\n", strlen(&arr[0] + 1)); //5char *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)); //隨機值
printf("%d\n", strlen(&p + 1)); //隨機值
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ù)組名)計算第一行數(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 計算第四行的大小(即使沒有第四行)三、總結
這些都是來自往年的筆試題,非常重要!??!學廢了嗎?!
建議收藏反復閱讀思考,加深對指針、數(shù)組和內存的理解!??!
到此這篇關于C語言sizeof和strlen的指針和數(shù)組面試題詳解的文章就介紹到這了,更多相關C語言 指針和數(shù)組內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟
本文主要介紹了CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06
C/C++ Qt 基本文件讀寫的基本使用(2種實現(xiàn))
文件的讀寫是很多應用程序具有的功能,本文主要介紹了兩種實現(xiàn)方法,第一種使用QFile類的IODevice讀寫功能直接讀寫,第二種是利用 QFile和QTextStream結合起來,用流的方式進行文件讀寫2021-11-11
C語言創(chuàng)建和操作單鏈表數(shù)據(jù)結構的實例教程
這篇文章主要介紹了C語言創(chuàng)建和操作單鏈表數(shù)據(jù)結構的實例教程,講解使用C語言實現(xiàn)鏈表結構時指針的使用,需要的朋友可以參考下2016-04-04
VS2022 CUDA環(huán)境配置的實現(xiàn)步驟
本文主要介紹了VS2022 CUDA環(huán)境配置的實現(xiàn)步驟,文中通過圖文示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05

