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

个人主页:Lei宝啊

愿所有美好如期而遇


第三组笔试题

char *p = "abcdef";

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

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

 

答案 

8 8 1 1 8 8 8

6 5 error error 随机值 随机值 5

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

 

解析 

	char* p = "abcdef";

	printf("%d\n", sizeof(p));
	//p是字符指针,大小为4/8

	printf("%d\n", sizeof(p + 1));
	//p指向字符'b',求的还是p的大小,4/8

	printf("%d\n", sizeof(*p));
	//p指向'a',解引用访问'a',所以大小为1个字节

	printf("%d\n", sizeof(p[0]));
	//'a',1字节

	printf("%d\n", sizeof(&p));
	//&p,指针类型为char**,还是指针,4/8

	printf("%d\n", sizeof(&p + 1));
	//跳过一个char**大小的指针,还是char**类型的指针,4/8

	printf("%d\n", sizeof(&p[0] + 1));
	//指向'b'的指针,4/8

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

	printf("%d\n", strlen(p));
	//长度为6

	printf("%d\n", strlen(p + 1));
	//长度为5

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

	printf("%d\n", strlen(p[0]));
	//同理

	printf("%d\n", strlen(&p));
	//随机值,指针类型为char**,指向p这个指针
	//注意p是指向字符串首元素的。

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

	printf("%d\n", strlen(&p[0] + 1));
	//指向第二个字符,长度为5

 

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