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

个人主页:Lei宝啊

愿所有美好如期而遇


前言:

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

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

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

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

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

 

第二组笔试题 

char arr[] = "abcdef";

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));

 答案

7 8 1 1 8 8 8

6 6 error error 6 随机值 5

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

解析

	char arr[] = "abcdef";

	printf("%d\n", sizeof(arr));
	//sizeof(数组名),计算整个数组的大小,
	//字符串结尾还有\0占一个字节的空间,共7个字节

	printf("%d\n", sizeof(arr + 0));
	//类比arr+1,这里的arr代表数组首元素地址,所以4/8

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

	printf("%d\n", sizeof(arr[1]));
	//第二个元素,数据类型为char,1个字节

	printf("%d\n", sizeof(&arr));
	//&arr,指针类型为数组指针,此时取出的是整个数组的地址,
	//但归根结底还是指针,占4/8个字节

	printf("%d\n", sizeof(&arr + 1));
	//数组指针向后走一个指针的距离,4/8

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

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

	//strlen是计算字符串长度的哦
	printf("%d\n", strlen(arr));
	//strlen遇到\0停止,所以得6

	printf("%d\n", strlen(arr + 0));
	//相同道理,6

	printf("%d\n", strlen(*arr));
	//error, *arr是'a',ASCII值为97,当做地址传入strlen,
	//成为野指针非法访问

	printf("%d\n", strlen(arr[1]));
	//error, 'b'也同理

	printf("%d\n", strlen(&arr));
	//&arr与arr地址相同,尽管其意义不同,
	//&arr指针类型为数组指针,会被转换成strlen接受的指针类型,
	//所以我们最终得到的还是6

	printf("%d\n", strlen(&arr + 1));
	//随机值,&arr+1跳过的是整个数组,所以我们无法判断何时会
	//再遇见\0,。

	printf("%d\n", strlen(&arr[0] + 1));
	//指向第二个元素,所以得到5

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