`
java-mans
  • 浏览: 11416747 次
文章分类
社区版块
存档分类
最新评论

笔试中遇到的问题总结(一)

 
阅读更多

1.关于结构体的sizeof

a.含有联合体的结构体的sizeof
struct s1
{
char *
ptr,ch;
//有指针变成4+4(为了对齐,char只占1。后补3空)
union A

//后面跟了A定义了一个类型,不占内存,而后面不跟A,是声明了结构体的一个成员,占内存,
{
short a,b;
unsigned int c:2, d:1;
};
struct s1* next; //指针占4
};

//这样是8+4=12个字节

struct s1
{
char *ptr,ch;
union

//联合体是结构体的成员,占内存,并且最大类型是unsigned int,占4
{
short a,b;
unsigned int c:2, d:1;
};
struct s1* next;
};//这样是8+4+4=16个字节

b.结构体含有结构体的sizeof

struct S1
{
char c;
int i;
};
struct S3
{
char c1;
S1 s;
char c2;
};
cout<<sizeof(S3); //S3=16

S1的最宽简单成员的类型为int,S3在考虑最宽简单类型成员时是将S1“打散”看的,所以S3的最宽简单类型为int,这样,通过S3定义的变量,其存储空间首地址需要被4整除,整个sizeof(S3)的值也应该被4整除。

c1的偏移量为0,s的偏移量呢这时s是一个整体,它作为结构体变量也满足前面三个准则,所以其大小为8,偏移量为4,c1与s之间便需要3个填充字节,而c2与s之间就不需要了,所以c2的偏移量为12,算上c2的大小为13,13是不能被4整除的,这样末尾还得补上3个填充字节。最后得到sizeof(S3)的值为16。


c.带有#pragma pack的sizeof

它是用来调整结构体对齐方式的,不同编译器名称和用法略有不同,VC6中通过#pragma pack实现,也可以直接修改/Zp编译开关。#pragma pack的基本用法为:#pragma pack( n ),n为字节对齐
数,其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值,


2.单链表倒置
在数据结构(严蔚敏版)线性表一节中,有一个逆序创建链表的算法,头插法和这个算法差不多,区别就是逆序创建链表是用给出的数字序列创建链表,而头插法是在原来的链表中从第一个节点开始,每次取出一个节点,然后把这个节点插在头节点后面,直到最后一个节点插到头节点后面,那么原来的链表就倒置了..

下面是C++代码

LNode *Reverse(LNode *Head)
{
LNode *p=Head->next;
LNode * q=NULL;
Head->next=NULL;
while(p)
{
q=p->next; //保存下一个节点的指针

p->next=Head->next;
Head->next=p; //把取出的节点插入到头节点的后面

p=q;
}
return Head;
}

3.关于a[i]是否和i[a]相等问题

#include "iostream"
using namespace std;
void main()
{
int a[5]={1,2,3,4,5};
int i=2;
printf("%d,%d,%d,%d/n",a[i],*(a+i),*(i+a),i[a]); //结果是3,3,3,3
}
1.C语言中访问数组元素a[i] 只是简单 替换成 (*((a)+(i)))。
2.编译器只是简单替换,不管a,i什么类型,只要能够进行(*((a)+(i)))运算,就可以进行a[i]运算
3.编译器只是简单替换,只检查(*((a)+(i)))运算是否可行,不会检查i是否越界,i是负数都可以。
4.编译器只是简单替换,(*((a)+(i)))=i[a]完全正确。
5.如果(*((a)+(i)))=(*((i)+(a)) (这应该是成立的),就有a[i]=i[a]。
C语言访问数组元素a[i]只是简单替换成(*((a) + (i)))
并没有规定a是首地址,i是偏移量。 无论a[i]还是i[a],编译器都先转成内部形式 *(a+i)和*(i+a);
对数据访问的时候,*(a+i)的方法是最根本的,最接近硬件上的含义。

4.关于类大小问题
#include "iostream"
using namespace std;

class x
{
public:
static int count;
//静态存储空间是系统独立开僻出来的一块空间,和类无关,所以不计算在内。
int number;
private:
char c;
//基类中的私有变量或私有方法会被派生类继承,但是无法访问

};
class xy:public x
{
private:
char y;
public:
static int type;
};
void main()
{
xy test;
cout<<sizeof(test);//结果为12,父类中的char c被继承了,占用空间,但是无法使用
}
1.在类中,如果什么都没有,则类占用1个字节,一旦类中有其他的占用空间成员,则这1个字节就不在计算之内,如一个类只有一个int则占用4字节而不是5字节。

2.如果只有成员函数,则还是只占用1个字节,因为类函数不占用空间

3.虚函数因为存在一个虚函数表,需要4个字节(保存在类存储空间开始),数据成员对象如果为指针则为4字节,注意有字节对齐,如果为13字节,则进位到16字节空间。

5.关于静态成员变量问题
#include<iostream>
using namespace std;
void main()
{
class A
{
int a;
static int b; //编译出错!!!
charc;
};
cout<<sizeof(A)<<endl;
}

由于静态数据成员的空间分配在全局数据区,因此在程序一开始运行的时候就必须存在,所以静态成员的空间的分配和初始化不可能在函数包括main主函数中 完成,因为函数在程序中被调用的时候才为内部的对象分配空间。

局部类中不允许出现静态数据成员。因为静态数据成员必须在程序运行时候就存在这导致程序无法为局部类中的静态数据成员分配空间。上面的代码是不允许的。


另外:静态成员不能在类定义里边初始化,只能在class body外初始化。
一般形式: 数据类型 类名::静态数据成员名=初值


6.派生类访问基类的私有变量的方法
1.成员函数
在基类中添加一个成员函数来获取这个成员变量的值。

class yuan
{
double r;

public:

double GetValueR(){return r;}
};

现在你可以在派生类调用GetValueR来获取R值。但是注意GetValueR()这个函数的访问权限必须是public或者protected,如果它本身也是private那么就跟r一样,在派生类是无法访问的了。


2.友元函数
友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

分享到:
评论

相关推荐

    互联网校招题库资料笔试面试真题具体面试问题回答技巧腾讯阿里培训资料.zip

    Java重点面试题 – 针对java面试过程中经常遇到的一些试题进行总结.docx JAVA面试基础知识点总结.docx Java面试笔记.docx 写出正则表达式,从一个字符串中提取链接地址.docx 出现几率最高和覆盖范围最广的一套经典...

    JAVA笔试面试资料JDBC HTTP、JSP、Servlet、Struts面试题汇总资料.zip

    Java重点面试题 – 针对java面试过程中经常遇到的一些试题进行总结.docx JAVA面试基础知识点总结.docx Java面试笔记.docx 写出正则表达式,从一个字符串中提取链接地址.docx 出现几率最高和覆盖范围最广的一套经典...

    java面试笔试总结

    常遇到的面试笔试题 word文档 对将从事JAVA开发工作的人很有帮助

    阿里测试笔试题总结

    2. 在C++语言中,若类C中定义了一个方法int f(int a,int b),那么方法( )不能与该方法同时存在于类C中。  A.int f(int x,int y) B.int f(float a,int b)  C.float f(int x,float y) D.int f(int x,...

    java面试笔试题大汇总

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的...

    Java笔试题目汇总

    Java笔试题目汇总 Java基础方面: 0、作用域public,private,protected,以及不写时的区别 答:区别如下: 作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ ...

    硬件工程师经典笔试题集锦

    硬件工程师经典笔试题集锦列举了硬件工程师笔试常遇到的知识点,也是硬件基本知识和常用技能的总结

    华为C++笔试题全部汇总

    2. 一个类里可以同时存在[同一个类里无论什么函数都不能函数名和参数完全一样]参数和函数名都相同的虚函数与静态函数(错误) 3. 父类的析构函数是非虚的,但是子类的析构函数是虚的,delete子类指针(指向该子类对象...

    护网面试题总结+安全工程师笔试问题

    具体实践中,公安部会组织攻防两方,进攻方会在一个月内对防守方发动网络攻击,检测出防守方(企事业单位)存在的安全漏洞。通过与进攻方的对抗,企事业单位网络、系统以及设备等的安全能力会大大提高。 当前,我国...

    嵌入式软件笔试面试题合集

    这是这个秋招面试了好多家...阅读建议:此资源是本人在秋招的时候遇到的一些技术性文艺以及一些问题的分析,所以在学习的过程要结合这些内容一起来实践,并调试对应的代码。 结合实际问题,本资源只是作为一个借鉴作用

    遇到的JAVA面试问题总结,只是面试问题

    给即将面试的java软件职业的一点帮助,自己面试过程中遇到的问题,以及一起培训的其他人面试问题的一个总结,只是问题总结,没有答案,答案可以自己百度

    程序员最常见的笔试面试题合集

    其中包含微软面试100题;名企笔试100题;十五个经典算法研究与总结、目录+索引;本人在笔试面试中遇到的疑惑等。

    笔试智力题大汇总

    各大公司智力测验大汇总,总有你能遇到的原题~

    java笔试题目以及答案

    java面试笔试题大汇总,总结了java,JavaScript,HTML等多个面试中遇到的问题

    高质量的C c++编程 面试笔试题

    这是很多大公司,关于C C++ 笔试面试 考的很多的内容,里面有我们经常会遇到的一些编程问题,堪称C C++ 的经典问题汇总

    C与C++笔试总结

    里面包含了在面试互联网公司时所遇到的问题总结,有待进一步完善

    Java笔试题大汇总

    多分支语句把表达式返回的值依次与每个case子句中的值相比较,如果遇到匹配的值,则执行该case子句后的语句序列。 4 下列叙述中,错误的是__D____。 A、父类不能替代子类 B、子类能够替代父类 C、子类继承父类 D、...

    java面试笔试题经典版

    java面试笔试题经典版,对面试中经常遇到的问题进行总结

    Oracle DBA笔试及面试题汇总

    1:SQL调整最关注的是什么?  2:Oracle的系统进程有哪些?作用是什么?  3:本地管理表空间和字典管理表空间的... 9:对于一个存在系统性能的系统,说出你的诊断处理思路  10:列举几种诊断IO、CPU、性能状况的方法

    java笔试面试题大全

    很详细,系统的总结了java程序员笔试,面试中经常遇到的问题。对找工作的朋友很有帮助!

Global site tag (gtag.js) - Google Analytics