优视科技一道指针笔试题目
今天晚上参加优视(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].str+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].str+32,这里str[2].str取出来的是一个地址,故st[2].str的偏移量(相对于str[0])为80,而str[2].str相对str[2]偏移了8个字节,故str[2].str的相对偏移量为88,加上32之后变为偏移量为120.、
4>由3的分析知指针p现在指向的地址相对偏移量为120,故p-((char*)(st)) 为120,这是由于(char*)st指向 数组开始地址,由于初始化的st为空,帮指针指向内容为空,故p-((char*)(st))=120.
版权声明:此文自动收集于网络,若有来源错误或者侵犯您的合法权益,您可通过邮箱与我们取得联系,我们将及时进行处理。
本文地址:https://www.gunzhua.com/jiuye/bishi/51282.html