C语言--指针面试笔试题

目录

前言

笔试题1:

题目解析: 

笔试题2:

题目解析:

笔试题3:

题目解析:

阿里笔试题:

 题目解析:


前言

        前面几章我们学习了指针的知识,今天一起来做一组与指针相关的面试笔试题吧。

笔试题1:

int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int *)(&a + 1);
    printf( "%d,%d", *(a + 1), *(ptr - 1));
    return 0;
}
//程序的结果是什么?

题目解析: 

*(a + 1)也就是a[1],所以结果为2.

int *ptr = (int *)(&a + 1);&a表示取出整个数组的地址,+1表示跳过整个数组,此时ptr已经出了数组, *(ptr - 1)又让ptr指向了数组最后一个元素。

笔试题2:

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

题目解析:

 p + 0x1,p为结构体指针,+1那就跳过一个结构体的大小,结果就为ox100020。

(unsigned long)p + 0x1),此时p为long类型的指针,因此只跳过一个字节,结果就为0x100001。

(unsigned int*)p + 0x1),此时p为long类型的指针,因此只跳过四个字节,结果就为0x100004。

笔试题3:

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

题目解析:

 char**pa指向了a,此时pa指向了a的第一个元素,对pa++,pa指向a的下一个元素。

 

阿里笔试题:

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

 题目解析:

按题目要求得到如图:

1.++cpp,也就是让cpp指向了c+2的位置,结果为 POINT。

2. *-- * ++cpp + 3,优先级我们先算*++cpp,也就是让cpp指向了c+1的位置,也就是char**cp[c+1],也就是char*c[1],在施行--操作,也就是指向了char*c[0]的位置,再进行+3操作,也就是让*c[0]+3,那么就指向了'E',所以得到结果ER。

3.*cpp[-2]+3 = **(cpp-2)+3,cpp-2让cpp回到了c+3的位置,也就是得到了char*c[3]的地址,也就是F的地址,再进行+3操作,就得到了S的地址,所以结果为ST。

4.cpp[-1][-1] + 1=*(*(cpp-1)-1)+1,*(cpp-1)就得到c+2,再-1,就得到了c+1的地址,也就是char*c[1]的地址,也就是'N'的地址,再加一就得到了‘E'的地址,所以结果为EW。

Guess you like

Origin blog.csdn.net/2301_76618602/article/details/133019432