指针和字符数组笔试题及其解析(第一组)

指针和字符数组笔试题及其解析(第一组)_第1张图片

个人主页:Lei宝啊

愿所有美好如期而遇


前言:

数组名在寻常情况下表示首元素地址,但有两种情况例外:

1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小

2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址 

3.sizeof是操作符,不是函数,并且sizeof不计算括号里的表达式,他会在编译阶段检查括号里的表达式的类型属性,计算出大小。(任何表达式都有两种属性,值属性和类型属性,

int a = 3; short b = 2; b = a + b;这个表达式的值属性就是5,类型属性就是short)

前言很重要,记住哦~  

第一组笔试题

int main()
{

	char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));

	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));

	return 0;
}

先自己做再看答案和解析哦~  

答案

6           随机值
8           随机值
1           error
1           error
8           随机值
8           随机值
8           随机值

(博主用的是64位机器,所以地址占的空间大小为8字节)  

解析

int main()
{

	char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", sizeof(arr));
	//sizeof里只有数组名,所以计算的是整个数组的大小

	printf("%d\n", sizeof(arr + 0));
	//此时数组名的意义是首元素的地址,类比arr+1,所以大小为4/8

	printf("%d\n", sizeof(*arr));
	//*arr访问的是char类型的数据,大小为1个字节

	printf("%d\n", sizeof(arr[1]));
	//第一个元素,一个字节

	printf("%d\n", sizeof(&arr));
	//&arr,指针类型为char (*)[6],数组指针是指针,4/8

	printf("%d\n", sizeof(&arr + 1));
	//数组指针向后走一个指针的距离,还是指针
	//而且sizeof并不做计算,只做类型检查

	printf("%d\n", sizeof(&arr[0] + 1));
	//第二个元素的地址,4/8

//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------

	printf("%d\n", strlen(arr));
	//strlen遇到\0才会停止,而数组末尾没有\0,所以是随机值
	//因为我们也不知道什么时候才会碰到\0

	printf("%d\n", strlen(arr + 0));
	//仍然是随机值

	printf("%d\n", strlen(*arr));
	//*arr是第一个元素,'a',他的ASCII码值为97,也就是说,
	//我们传过去的97将会被当做是地址,但这个地址不是我们的
	//是个野指针,所以会导致非法访问,error

	printf("%d\n", strlen(arr[1]));
	//同'a'一个道理,error

	printf("%d\n", strlen(&arr));
	//&arr,指针类型为数组指针,但是strlen接受的指针类型为
	//const char*,我们要传的数组指针将会被转换成const char*类型
	//同时,&arr与arr的地址是相同的,尽管他们所代表的意义和类型不同
	//所以是随机值

	printf("%d\n", strlen(&arr + 1));
	//同上,随机值

	printf("%d\n", strlen(&arr[0] + 1));
	//指向第二个元素,随机值

	return 0;
}

 

你可能感兴趣的:(C语言笔试题目详解,笔试题,字符数组,C语言)