广博吧

位置:首页 > 学习经验 > 考研

优视科技一道指针笔试题目

考研2.26W

今天晚上参加优视(UC)的笔试,我报了一个c++的软件开发工程师,考前我就想这次一定会考指针题目,所以事先就看了很多关于指针的内容,果然,还是出了一道指针,并且包含有结构体struct,题目是这样的,前提是在一台i386的机子上运行

优视科技一道指针笔试题目

#include

struct a

{

int b;

short*pd;

char str[32];

};

a st[16];

int _tmain(int argc, _TCHAR* argv[])

{

char * p= (char*)(st[2]+32);

cout<

return 0;

}

问你输出结果是什么?

哇!!!!,看到这里是不是感觉到有点头大呢!虽然考前看了很多指针的东西,但是到这里却还是头大,好了,接下来我就认真分析一下这道题目:

1> 看准前提条件,这是一台I386的机子,这个条件很用,它说明了我们运行平台是一个32位机,因此int类型占用4个字节32位。

2> 接下来我们分析一下struct类型,前面一个int b, 占用4个字节,中间一个short类型占用两个字节,后面一个char类型的数组,当然是占用32个字节,到这里你认为分析完了吗,很不幸,如果你只分析到这一步,肯定得不到正确结果,现在让我们来想一想struct类型在编译之后数据存放地址的对齐问题,这涉及到一个原则就是sizeof(struct_name)一定是结构体中最长类型的'整数倍,即sizeof(a)%4==0,这样计算则可知sizeof(a)==40,这种对齐方式是为了计算机计算时的方便,是编译器性能优化的一部分,具体细节你可以去google一下,上面的计算方式很简单,但是并不通用。

3>经过第二步的分析我们知道a的大小为40个字节,接下来我们分析st[2]+32,这里str[2]取出来的是一个地址,故st[2]的偏移量(相对于str[0])为80,而str[2]相对str[2]偏移了8个字节,故str[2]的相对偏移量为88,加上32之后变为偏移量为120.、

4>由3的分析知指针p现在指向的地址相对偏移量为120,故p-((char*)(st)) 为120,这是由于(char*)st指向 数组开始地址,由于初始化的st为空,帮指针指向内容为空,故p-((char*)(st))=120.