关于指针的笔试题(保姆级讲解)

     在这篇文章主要是历年指针的一些经典面试题。

目录

一、练手小题

1.1 问题描述

1.2 问题分析

1.3 运行结果

二、笔试题1

2.1 问题描述

2.2 问题分析

2.3 运行结果 

 三、笔试题2

3.1 问题描述

3.2 问题分析

3.3 运行结果

四、笔试题3

4.1 问题描述

4.2 问题分析

4.3 运行结果

 五、笔试题4

5.1 问题描述

5.2 问题解析

5.3 运行结果

六、笔试题5

6.1 问题描述

6.2 问题分析

6.3 运行结果

七、笔试题6

7.1 问题描述

7.2 问题分析

7.3 运行结果

八、笔试题7

8.1 问题描述

8.2 问题分析

8.3 运行结果

九、笔试题8

9.1 问题描述

9.2 问题分析

9.3 运行结果


     在最开始我们先来一道开胃小菜进入状态吧!

一、练手小题

1.1 问题描述

下面代码的运行结果是什么?

#include <stdio.h>
int main()
{
	short num = 20;
	int a = 1;
	printf("%d\n", sizeof(num = a + 5));

	printf("%d\n", num);
	return 0;
}

1.2 问题分析

     上面的代码主要是考察我们对于sizeof操作符的理解,首先sizeof操作符对sizeof括号内部的表达式是不进行运算的,它主要是通过一定的分析知道表达式的类型,根据表达式的类型直接得出结果,不会对表达式进行运算。

     在上述的代码中,a,5都是整型,num是short类型,a+5的值要放到num中,就会发生截断,num = a + 5;这个表达式是一个赋值表达式,最终结果的类型是由num的类型决定的,所以sizeof会直接分析出 num = a + 5;这个表达式的类型,得到结果2,由于他不会对括号内的表达式num = a + 5;进行计算,所以num依然是20。

1.3 运行结果

二、笔试题1

2.1 问题描述

下面代码的运行结果是什么?

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

2.2 问题分析

 

2.3 运行结果 

 三、笔试题2

3.1 问题描述

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

3.2 问题分析

 

3.3 运行结果

四、笔试题3

4.1 问题描述


#include<stdio.h>

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.2 问题分析

%x是以16进制打印,%x打印时,前面有0,省略掉。

 

4.3 运行结果

 五、笔试题4

5.1 问题描述

下面代码的运行结果是什么?

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

5.2 问题解析

5.3 运行结果

六、笔试题5

6.1 问题描述

下面代码输出什么?

#include <stdio.h>
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]);
    return 0;
}

6.2 问题分析

 

6.3 运行结果

七、笔试题6

7.1 问题描述

下面的代码会输出什么?

#include <stdio.h>
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.2 问题分析

7.3 运行结果

八、笔试题7

8.1 问题描述

下面代码输出什么?

#include <stdio.h>
int main()
{
	char* a[] = { "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

8.2 问题分析

8.3 运行结果

九、笔试题8

9.1 问题描述

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

9.2 问题分析

 

 

9.3 运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值