【校招面经】8道指针面试真题,快来检测自己掌握了几道。

简介: 【校招面经】8道指针面试真题,快来检测自己掌握了几道。

指针面试真题一

给你一段代码,问程序的结果是什么?

1. #include<stdio.h>
2. int main()
3. {
4. int a[5] = { 1, 2, 3, 4, 5 };
5. int* ptr = (int*)(&a + 1);
6. printf("%d,%d", *(a + 1), *(ptr - 1));
7. return 0;
8. }

这道题比较简单,大家稍微思考一下应该就知道了,不理解的看下面哦!

知识点补充:

指针类型决定了指针向前或向后走一步的步长(±整数),单位是字节。详情请看我这一篇文章:

初步拿捏C指针

解题思路:

指针面试真题二

已知结构体大小是20字节,问下列表达式的值分别是多少?

1. #include<stdio.h>
2. struct Test
3. {
4.  int Num;
5.  char* pcName;
6.  short sDate;
7.  char cha[2];
8.  short sBa[4];
9. }*p;
10. //假设p 的值为0x100000。 如下表表达式的值分别为多少?
11. //已知,结构体Test类型的变量大小是20个字节
12. int main()
13. {
14.   printf("%p\n", p + 0x1);
15.   printf("%p\n", (unsigned long)p + 0x1);
16.   printf("%p\n", (unsigned int*)p + 0x1);
17.   return 0;
18. }

解题思路:

指针面试真题三

在小端存储模式下,给出下面一段程序,问输出什么?(vs2019采用的小端存储)

1. #include<stdio.h>
2. 
3. int main()
4. {
5. int a[4] = { 1, 2, 3, 4 };
6. int* ptr1 = (int*)(&a + 1);
7. int* ptr2 = (int*)((int)a + 1);
8. printf("%x,%x", ptr1[-1], *ptr2);
9. return 0;
10. }

知识点补充

这里要补充大小端的概念:

大端字节序存储:当一个数据的低位放到高地址处,数据的高位放到低地址处;

小端字节序存储:当一个数据的低位放到低地址处,数据的高位放到高地址处.

(不了解大小端存储的博主后续会出相应的内容)

解题思路

指针面试真题四

这题不难,不过有小坑哦

1. #include <stdio.h>
2. int main()
3. {
4. int a[3][2] = { (0, 1), (2, 3), (4, 5) };
5. int *p;
6.     p = a[0];
7. printf( "%d", p[0]);
8. return 0;
9. }

知识点补充

逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果,这里需要注意哦,每个表达式都会执行计算,只不过选用最后一个表达式的结果作为整个表达式的结果。了解更多,点击博主的这篇文章:对C语言操作符的再认识

解题思路

指针面试真题五

给出如下程序,问输出什么值?

1. #include<stdio.h>
2. int main()
3. {
4. int a[5][5];
5. int(*p)[4];
6.     p = a;
7. printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
8. return 0;
9. }

知识点补充

指针-指针:

注意哦,使用指针-指针运算的时候,前提是两个指针指向的是同一块内存空间,那何为指向同一块内存空间呢?最典型的例子就是数组。

指针-指针其实表示的是两个指针中间的元素个数,注意哦,不是中间有几个字节。

指针面试真题六

很简单的一道题:

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

解题思路

指针面试真题七

这道题实际上是为下一题过度准备的。

1. #include <stdio.h>
2. int main()
3. {
4.  char* a[] = { "work","at","alibaba" };
5.  char** pa = a;
6.  pa++;
7.  printf("%s\n", *pa);
8.  return 0;
9. }

解题思路

指针面试真题八

注意哦,这道题算是这几道中难度最大的一道,但是有了前一题的思路,这道题也就不再那么难以理解。

1. #include<stdio.h>
2. int main()
3. {
4.  char* c[] = { "ENTER","NEW","POINT","FIRST" };
5.  char** cp[] = { c + 3,c + 2,c + 1,c };
6.  char*** cpp = cp;
7.  printf("%s\n", **++cpp);
8.  printf("%s\n", *-- * ++cpp + 3);
9.  printf("%s\n", *cpp[-2] + 3);
10.   printf("%s\n", cpp[-1][-1] + 1);
11.   return 0;
12. }

解题思路

一开始,在内存中是这么存储的:

相关文章
|
3月前
|
C++
C/C++工程师面试题(指针篇)
C/C++工程师面试题(指针篇)
54 0
|
4月前
|
算法 程序员 索引
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离
|
4月前
C面试总结-指针与引用
C面试总结-指针与引用
23 0
|
2月前
|
编解码 缓存 安全
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
35 1
|
2月前
|
存储 C语言
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
|
3月前
|
安全 IDE Java
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
49 1
|
4月前
|
C++
面试题:常量指针和指针常量?
面试题:常量指针和指针常量?
21 0
|
4月前
|
C++
面试题:如何避免野指针?
面试题:如何避免野指针?
28 0
|
4月前
|
存储 C++
面试题:C/C++引用和指针的区别?
面试题:C/C++引用和指针的区别?
35 0
|
4月前
|
存储 C++
面试题:数组和指针的区别?
面试题:数组和指针的区别?
27 0