C语言指针与数组笔试题(打好基础进大厂拿offer)

作者:旧梦拾遗186

专栏:C语言编程----小比特成长日记

C语言指针与数组笔试题(打好基础进大厂拿offer)_第1张图片

每日励志:

人生的路,靠自己一步步走去,真正能保护你的,是你自己的人格选择和文化选择,那么反过来,真正能伤害你的,也是一样,自己的选择——余秋雨

目录

一.前言:

二.一维数组:

 1.题目:

2.解析: 

3.答案:

 4.易错点回顾:

三.字符数组:

题目一:

a)解析: 

 c)答案

d)易错点重现:

题目二:

 a)解析:

b)答案:

题目三: 

a) 解析:

 b)答案:

 题目四:

a)解析

 题目五:

a)解析:

​编辑

四.二维数组

 a)解析:

五结语:


一.前言:

今天小编带大家学习,指针和数组题目的练习,做题是深入了解知识的关键,千万不可骄傲自满,要保持空卑心态,虚心学习。

二.一维数组:

 1.题目:

#include
int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a + 0));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(a[1]));
	printf("%d\n", sizeof(&a));
	printf("%d\n", sizeof(*&a));
	printf("%d\n", sizeof(&a + 1));
	printf("%d\n", sizeof(&a[0]));
	printf("%d\n", sizeof(&a[0] + 1));
	return 0;
}

2.解析: 

注意:

1.我们要知道sizeof()计算的空间所占字节大小,

2.数组名是首元素地址(两个例外:1.&数组名表示整个数组的地址,sizeof(数组名)表示整个数组)

3.要知道地址在32位平台为4字节,64位平台为8字节

4.当前平台为x86平台(32位平台)

int main()
{
	int a[] = { 1,2,3,4 };

	printf("%d\n", sizeof(&a + 1));//4/8
	//&a取出的是数组的地址
	//&a-->  int(*)[4]
	//&a+1 是从数组a的地址向后跳过了一个(4个整型元素的)数组的大小
	//&a+1还是地址,是地址就是4/8字节
	//
	printf("%d\n", sizeof(&a[0]));//4/8
	//&a[0]就是第一个元素的地址
	//计算的是地址的大小
	printf("%d\n", sizeof(&a[0] + 1));//4/8
	//&a[0]+1是第二个元素的地址
	//大小是4/8个字节
	//&a[0]+1 ---> &a[1]
	//

	printf("%d\n", sizeof(a));//16
	//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
	printf("%d\n", sizeof(a + 0));//4
	//a不是单独放在sizeof内部,也没有取地址,所以a就是首元素的地址,a+0还是首元素的地址
	//是地址,大小就是4/8个字节
	printf("%d\n", sizeof(*a));//4
	//*a中的a是数组首元素的地址,*a就是对首元素的地址解引用,找到的就是首元素
	//首元素的大小就是4个字节
	printf("%d\n", sizeof(a + 1));
	//这里的a是数组首元素的地址
	//a+1是第二个元素的地址
	//sizeof(a+1)就是地址的大小
	printf("%d\n", sizeof(a[1]));//4
	//计算的是第二个元素的大小
	printf("%d\n", sizeof(&a));//4/8
	//&a取出的数组的地址,数组的地址,也就是个地址
	printf("%d\n", sizeof(*&a));//16
    //这里有两种理解方式:
	//1.&a----> int(*)[4]
	//&a拿到的是数组名的地址,类型是 int(*)[4],是一种数组指针
	//数组指针解引用找到的是数组
	//*&a ---> a
	//
	//2.
	//&和*抵消了
	//*&a ---> a
	//
	return 0;
}

3.答案:

C语言指针与数组笔试题(打好基础进大厂拿offer)_第2张图片

 4.易错点回顾:

    printf("%d\n", sizeof(*&a));//16
    这里有两种理解方式:
    1.&a----> int(*)[4]
    &a拿到的是数组名的地址,类型是 int(*)[4],是一种数组指针
    数组指针解引用找到的是数组
    *&a ---> a
    2.&和*抵消了
    *&a ---> a

    printf("%d\n", sizeof(a + 0));//4
   a不是单独放在sizeof内部,也没有取地址,所以a就是首元素的地址,a+0还是首元素的地      址
    是地址,大小就是4/8个字节
   

三.字符数组:

题目一:

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));
	return 0;
}

a)解析: 

//int main()
//{
//	char arr[] = { 'a','b','c','d','e','f' };
//	printf("%d\n", sizeof(arr));//6
//	//sizeof(数组名)
//	printf("%d\n", sizeof(arr + 0));//4/8
//	//arr + 0 是数组首元素的地址
//	printf("%d\n", sizeof(*arr));//1
//	//*arr就是数组的首元素,大小是1字节
//	//*arr --> arr[0]
//	//*(arr+0) --> arr[0]
//	printf("%d\n", sizeof(arr[1]));//1
//	printf("%d\n", sizeof(&arr));//4/8
//	//&arr是数组的地址,是地址就是4/8个字节
//	printf("%d\n", sizeof(&arr + 1));//4/8
//	//&arr + 1是数组后的地址
//	//
//	printf("%d\n", sizeof(&arr[0] + 1));//4/8
//	//&arr[0] + 1是第二个元素的地址
//	//
//	return 0;
//}

 c)答案

C语言指针与数组笔试题(打好基础进大厂拿offer)_第3张图片

d)易错点重现:

printf("%d\n", sizeof(*arr));//1
    //*arr就是数组的首元素,大小是1字节
    //*arr --> arr[0]
   //*(arr+0) --> arr[0]

题目二:

#include
int main()
{
	//字符数组
	char arr[] = { 'a','b','c','d','e','f' };
	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;
}

 a)解析:

#include
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };

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

//	printf("%d\n", strlen(*arr));//--> strlen('a');-->strlen(97);//野指针
//	printf("%d\n", strlen(arr[1]));//-->strlen('b')-->strlen(98);

	printf("%d\n", strlen(&arr));//随机值
	printf("%d\n", strlen(&arr + 1));//随机值-6
	printf("%d\n", strlen(&arr[0] + 1));//随机值-1

	return 0;
}

注意:这里arr[]结束标识\0是随机出现的,所以在测量时会产生随机值。

 注意一下strlen的功能:

 里面传入的是指针,也就是地址。

 所以当传入数字时会产生野指针,编译器报错;

b)答案:

1.随机值2.随机值3.报错4.报错5.随机值6.随机值-6 7.随机值-1

题目三: 

#include
int main()
{
	

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

	return 0;
}

a) 解析:

#include
int main()
{
	

	char* p = "abcdef";
	[a b c d e f \0]
	//printf("%d\n", sizeof(arr));//7
	//printf("%d\n", sizeof(arr + 0));//4/8->&a[0]地址的字节大小为4
	//printf("%d\n", sizeof(*arr));//1
	//printf("%d\n", sizeof(arr[1]));//1
	//printf("%d\n", sizeof(&arr));//4/8
	//printf("%d\n", sizeof(&arr + 1));//4/8
	//printf("%d\n", sizeof(&arr[0] + 1));//4/8

	return 0;
}

 b)答案:

C语言指针与数组笔试题(打好基础进大厂拿offer)_第4张图片

 题目四:

#include
int main()
{
	char* arr = "abcdef";
	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;
}

a)解析

注意:此字符串有\0结尾

int main()
{
	char* arr = "abcdef";
	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
	return 0;
}

 题目五:

#include
#include
int main()
{
	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));
	return 0;
}

a)解析:

#include 
#include 
int main()
{
	char* p = "abcdef";
	printf("%d\n", sizeof(p));//4/8
	//p为指针变量,大小为4/8

	printf("%d\n", sizeof(p + 1));//4/8
	//地址大小为4/8

	printf("%d\n", sizeof(*p));//1
	//就是第一个元素

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

	printf("%d\n", sizeof(&p));//4/8
	//地址就是4/8

	printf("%d\n", sizeof(&p + 1));//4/8
	//地址就是4/8

	printf("%d\n", sizeof(&p[0] + 1));//4/8
	//地址就是4/8

	
	printf("%d\n", strlen(p));//6
	//从首元素地址开始到结束6个元素

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

	printf("%d\n", strlen(*p));//error

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

	printf("%d\n", strlen(&p));//随机值
	//在p的角度上,后面的'\0'不确定

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

	printf("%d\n", strlen(&p[0] + 1));//5
	//从第二个元素的地址开始
	return 0;
}

C语言指针与数组笔试题(打好基础进大厂拿offer)_第5张图片

这里还有关于二维数组的题目:

四.二维数组

#include 
int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a[0][0]));
	printf("%d\n", sizeof(a[0]));
	printf("%d\n", sizeof(a[0] + 1));
	printf("%d\n", sizeof(*(a[0] + 1)));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(*(a + 1)));
	printf("%d\n", sizeof(&a[0] + 1));
	printf("%d\n", sizeof(*(&a[0] + 1)));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a[3]));
	return 0;
}

 a)解析:

#include 
int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//48
	//3行4列,12*4=48

	printf("%d\n", sizeof(a[0][0]));//4
	//第一行第一列元素

	printf("%d\n", sizeof(a[0]));//16
	//第一行,因为此时a[0]挨着sizeof即是一维数组的大小:4*4=16

	printf("%d\n", sizeof(a[0] + 1));//4/8
	//a[0]没有挨着sizeof,a[0]代表的是第一行整个一维数组首元素的地址,既第一行第一列的地址
	//a[0]+1就是第一行第二列的地址,是地址就是4/8

	printf("%d\n", sizeof(*(a[0] + 1)));//4
	//就是第一行第二列的元素,大小是4个字节

	printf("%d\n", sizeof(a + 1));//4/8
	//a虽然二维数组的地址,但是并没有单独放在sizeof内部,也没取地址
	//a表示首元素的地址,二维数组的首元素是它的第一行,a就是第一行的地址
	//a+1就是跳过第一行,表示第二行的地址
	//地址就是4/8个字节

	printf("%d\n", sizeof(*(a + 1)));//16
	//相当于第二行的大小

	printf("%d\n", sizeof(&a[0] + 1));//4/8
	//&a[0]得到的是第一行的地址
	//&a[0]+1得到的是第二行的地址
	//地址大小就是4/8

	printf("%d\n", sizeof(*(&a[0] + 1)));//16
	//得到的是第二行的大小

	printf("%d\n", sizeof(*a));//16
	//a表示首元素的地址,就是第一行的地址
	//*a就是第一行地址的解引用,取到的就是第一行
	//第一行的大小就是16

	printf("%d\n", sizeof(a[3]));//16
	//这里可能会有人说越界访问了,会有问题
	//但是实际上并不会:
	//我们并没有对其进行操作,只是访问
	//可以举个例子:int a = 10;sizeof(int);sizeof(a);
	//我们计算a的时候,只需要知道a的类型就知道几个字节了
	//对于a[3]也是一样的道理,类型是确定的,所以为16

	return 0;
}

五结语:

每个人的成长都是能力和想要得到的东西,不断匹配的过程,当你的才华和欲望不匹配时,你就该静下心来学习了,如果小编的总结能对你有所帮助,希望小伙伴们三连加关注哦,你的支持是小编创作的最大动力。

C语言指针与数组笔试题(打好基础进大厂拿offer)_第6张图片

你可能感兴趣的:(C语言编程,大数据,c语言,学习,开发语言,蓝桥杯)