当前位置:网站首页>指针和数组笔试题解析

指针和数组笔试题解析

2022-07-06 07:58:00 拾至灬名瑰


前言

大家好久不见哇!!!最近由于学校的考试,也没有更新博客,直到这两天才把学校的考试解决完,哈哈哈哈哈哈,已经迫不及待的给大家讲解啦!!!
今天我给大家讲讲关于数组和指针的面试题,内容可能会有些难度,有不会的知识点可以参考

指针进阶

还有一点本主机为32位环境,所以指针默认大小为4个字节!!!


一、指针和数组笔试题解析

1.一维数组

int main() {
    

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

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

	return 0;
}

在这里插入图片描述
在这里插入图片描述

2.字符数组

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


	printf("%d\n", strlen(arr));//随机值
	printf("%d\n", strlen(arr + 0));//随机值
	//printf("%d\n", strlen(*arr));//--->strlen('a');--->strlen(97);//野指针
	有问题
	--->strlen('b');--->strlen(98);//野指针
	//printf("%d\n", strlen(arr[1]));


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

	return 0;
}

在这里插入图片描述


int main() {
    
	char arr[] = "abcdef";

	printf("%d\n", sizeof(arr));//7
	printf("%d\n", sizeof(arr + 0));//4/8
	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



	//strlen是求字符串长度的,关注的是字符串中的\0,计算的是\0之前出现的字符的个数
	//strlen是库函数,只针对字符串
	//sizeof只关注占用内存空间的大小,不在乎内存中放的是什么
	//sizeof是操作符
	printf("%d\n", strlen(arr));//6
	printf("%d\n", strlen(arr + 0));//6

	有问题
	//printf("%d\n", strlen(*arr));
	//printf("%d\n", strlen(arr[1]));

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

	return 0;
 }

在这里插入图片描述
在这里插入图片描述

3.二维数组

int main() {
    

	//二维数组
	int a[3][4] = {
     0 };
	printf("%d\n", sizeof(a));//48
	printf("%d\n", sizeof(a[0][0]));//4

	//a[0]是第一行这一个一维数组的数组名,单独放在sizeof内部,a[0]表示第一个整个这个一维数组
	//sizeof(a[0])计算的是这一行的大小
	printf("%d\n", sizeof(a[0]));//16

	//(a[0] + 1)--->&a[0][0]+1
	//a[0]并没有单独放在sizeof内部,也没取地址
	//a[0]就表示首元素的地址,就是第一行这个一维数组的第一个元素的地址
	//a[0]+1就是第一行第二个元素的地址
	printf("%d\n", sizeof(a[0] + 1));//4/8

	printf("%d\n", sizeof(*(a[0] + 1)));//4
	//a虽然是二维数组的地址,但是并没有单独放在sizeof内部,也没取地址
	//a表示首元素的地址,二维数组的首元素是他的第一行,a就是第一行的地址
	//a+1就是跳过第一行,表示第二行的地址
	printf("%d\n", sizeof(a + 1));//4/8
	//*(a + 1)是对第二行地址的解引用,拿到的是第二行
	//*(a+1)--->a[1]
	//sizeof(*(a+1))--->sizeof(a[1])
	printf("%d\n", sizeof(*(a + 1)));//16
	//&a[0]--对第一行的数组名取地址,哪出的是第一行的地址
	//&a[0]+1--得到的是第二行的地址
	printf("%d\n", sizeof(&a[0] + 1));//4/8

	printf("%d\n", sizeof(*(&a[0] + 1)));//16
	//a表示首元素的地址,就是第一行的地址
	//*a就是对第一行地址的解引用,拿到的就是一行
	printf("%d\n", sizeof(*a));//16

	printf("%d\n", sizeof(a[3]));//16


	return 0;
}

在这里插入图片描述
在这里插入图片描述

总结:
数组名的意义:

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址。

二、指针笔试题

1.面试题1

int main()
{
    
	int a[5] = {
     1, 2, 3, 4, 5 };
	int* ptr = (int*)(&a + 1);//&a的类型是 int(*)[5],所以需要强制类型转化为int*
	printf("%d,%d", *(a + 1), *(ptr - 1));
	return 0;
}
//程序的结果是什么?

在这里插入图片描述
在这里插入图片描述

2.面试题2

//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
    
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p= (struct Test*)0x100000;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
    
	printf("%p\n", p + 0x1);//0x00100014
	//0x100000+20--->//0x100014
	printf("%p\n", (unsigned long)p + 0x1);//0x00100001
	//1,048,576+1--->1,048,577
	//0x100001
	printf("%p\n", (unsigned int*)p + 0x1);//0x00100004
	//0x100000+4--->//0x100004
	return 0;
}

在这里插入图片描述
在这里插入图片描述

3.面试题3

int main()
{
    
	int a[4] = {
     1, 2, 3, 4 };
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x,%x", ptr1[-1], *ptr2);
	return 0;
}

在这里插入图片描述

在这里插入图片描述

4.面试题4

int main()
{
    
	int a[3][2] = {
     (0, 1), (2, 3), (4, 5) };
	int* p;
	p = a[0];//a[0]是第一行的数组名
	//a[0]表示首元素的地址,即a[0][0]的地址,&a[0][0]
	printf("%d", p[0]);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

5.面试题5

int main()
{
    
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);//-4 -4
	//地址相减的值是中间元素的个数
	return 0;
}

在这里插入图片描述
在这里插入图片描述

6.面试题6

int main()
{
    
	int aa[2][5] = {
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int* ptr1 = (int*)(&aa + 1);
	int* ptr2 = (int*)(*(aa + 1));
	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
	return 0;
}

在这里插入图片描述
在这里插入图片描述

7.面试题7

int main()
{
    
	char* a[] = {
     "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

8.面试题8

int main()
{
    
	char* c[] = {
     "ENTER","NEW","POINT","FIRST" };
	char** cp[] = {
     c + 3,c + 2,c + 1,c };
	char*** cpp = cp;
	printf("%s\n", **++cpp);//point
	printf("%s\n", *-- * ++cpp + 3);//er
	printf("%s\n", *cpp[-2] + 3);// st
	printf("%s\n", cpp[-1][-1] + 1);//ew
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里要注意的是++cpp是将cpp的地址改变了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了关于数组和指针的面试题解析,本次文章内容有点多,需要大家慢慢理解,大家有不懂可以私聊我哦!!!

原网站

版权声明
本文为[拾至灬名瑰]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_61560468/article/details/125621467