栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

指针经典笔试面试题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

指针经典笔试面试题

写出下列程序的结果。

1.
#include
int main ()
{
	int a[5] = { 1,2,3,4,5 };
	int* par = (int*)(&a + 1);
	printf("%d %d", *(a + 1), *(par - 1));
}

结果:

 解析:

(1)int *  par  =  (int*)  (&a + 1) —— &a,取出整个数组的地址,再 + 1 ,跳过20个字节(整个数组),然后将其强制转换为整型类型,存入整型指针par中,par 指向数组的后面。

(2)* (a+1) —— a是数组名,代表首元素地址,+1,跳过4个字节,即a+1相当于&a[1],所以打印结果为2。

(3)* ( par-1 ) —— par指向数组a后面的地址,par是整型指针,- 1,指针往后移4个字节,所以指针指向的是a[4]的地址,所以打印结果为5。

2.
#include
struct test
{
	int num;
	char* name;
	short date;
	char ch[10];
}*p;//结构体大小为20
int main()
{
	p = (struct test*)0x00100000;
	printf("%pn",p+0x1);
	printf("%pn", (struct test*)((unsigned long)p+0x1));
	printf("%pn", (unsigned int*)p + 0x1);
}

结果:

 解析:

(1)p =  ( struct  test * ) 0x00100000 ,p是一个结构体指针 ,0x100000是一串十六进制数,通过类型强制转换,将它变为结构体类型的地址,存在指针p中。

(2)题中出现的0x1,是十六进制数,等于十进制数1。

(3)printf (" %pn " , p + 0x1 ) ——  p + 0x1就等于p+1 ,p是结构体类型指针,+ 1 ,指针后移20个字节,地址是用十六进制表示,所以相当于地址加0x14,故打印结果为 0x00100014。

(4)printf (" %pn ", ( struct test* ) ( ( unsigned long ) p + 0x1 ) ) ——  ( unsigned long ) p,将p转换为无符号长整形数 100000,+ 1,变成100001,再将其转换结构体类型的指针,所以打印结果为00100001。

(5)printf(" %pn " , ( unsigned int * ) p + 0x1 ) —— ( unsigned int * ) p,将p转换为无符号整型指针,+ 1 ,指针后移4个字节,所以打印结果为00100004。

3.
#include
int main()
{
	int a[4] = { 1,2,3,4 };
	int* par1 = (int*)(&a + 1);
	int* par2 = (int*)((int)a + 1);
	printf("%x %x", par1[-1],*par2);
}

结果:

解析:

1,2题中与这道题重复考点不再讲解。

这个结果是在vs上的编译结果,采用的是小端存储模式。

小端存储模式:数据的高位保存在高地址处。

比如1的储存:

 这道题中:

*par的打印结果位2000000 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/444106.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号