日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言sizeof和strlen的指針和數組面試題詳解_C 語言

作者:scut-ALong ? 更新時間: 2022-06-12 編程語言

一、概念 ????????

sizeof:

sizeof操作符的結果類型為size_t,(它在頭文件用typedfe定義為unsigned int類型),計算的是分配空間的實際字節數。sizeof是運算符,可以以類型、函數、做參數 。

strlen:

strlen結果類型也為size_t(size_t strlen( const char *string )),但strlen是計算的空間中字符的個數(不包括‘\0’)。strlen是函數,只能以char*(字符串)做參數。而且,要想得到的結果正確必須包含 ‘\0’(通過strlen的實現得知)。

二、例題及解析

首先我們需要知道數組名的意義:

1.sizeof(數組名),這里的數組名表示整個數組,計算的是整個數組的大小。

2.&數組名,這里的數組名表示整個數組,取出的是整個數組的地址。

3.除此之外所有的數組名都表示首元素的地址。

2.1 一維數組

int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));		   //16  a是整個數組的大小,sizeof計算出結果為16字節
	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數組的地址,4個字節
	printf("%d\n", sizeof(*&a));       //16  *和&抵消
	printf("%d\n", sizeof(&a+1));      //4   4個字節的地址,跳過了4
	printf("%d\n", sizeof(&a[0]));	   //4
	printf("%d\n", sizeof(&a[0]+1));   //4
	//總結: 只要是地址,不論什么類型,大小都為4個字節

2.2 字符數組

char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));		//6
	printf("%d\n", sizeof(arr+0));		//4  首元素地址為4個字節
	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才能返回數據的長度
	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是數組的地址
	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  數組的地址 4個字節
	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));	//5
char *p = "abcdef";
	printf("%d\n", sizeof(p));			//4  p是指針變量,求指針變量的大小,為4個字節
	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開始數

2.3 二維數組

	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));			 
	//48  二維數組中sizeof(a),a同樣表示整個數組
	printf("%d\n", sizeof(a[0][0]));	 
	//4 
	printf("%d\n", sizeof(a[0]));		 
	//16 a[0]可看作第一行的數組名,sizeof(數組名)計算第一行數組大小
	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為第一行一維數組的地址,+1為第二行的地址
	printf("%d\n", sizeof(*(a + 1)));	 
	//16 第二行地址的解引用,是數組指針的解引用,訪問的是一個數組的大小
	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 計算第四行的大小(即使沒有第四行)

三、總結

這些都是來自往年的筆試題,非常重要!!!學廢了嗎?!

建議收藏反復閱讀思考,加深對指針、數組和內存的理解!!!

原文鏈接:https://blog.csdn.net/qq_43460230/article/details/123908433

欄目分類
最近更新