C/C++笔试题

/*
    *(ptr-1)输出的解释:
    &a + 1不是首地址 + 1,系统会认为加了一个整个a数组,偏移了整个
    数组a的大小(也就是5个int的大小)。所以int*ptr=(int*)(&a+1);
    其实ptr实际是&(a[5]),也就是a+5.&a是数组指针,其类型为int(*)[5];
    而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的
    大小不同,a是长度为5的int数组指针,所以要加5*sizeof(int),所以
    ptr实际是a[5],但是ptr与(&a+1)类型是不一样的,这点非常重要,所以
    ptr-1只会减去sizeof(int*);a,&a的地址是一样的,但意思就不一样了,
    a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,
    a+1是数组下一元素的地址,即a[1],而&a+1是下一个对象的地址,即a[5]。
*/
/*
    Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端
    Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端
    u.x数组在内存中是:0A 01 00 00,由于本机是小端机,所以真值是0X 00 00 01 0A
*/
/*****************************************
> File Name : test.cpp
> Description : c/c++ 笔试题
    64bit win7 VS2013 小端机
> Author : linden
> Date : 2016-02-28
*******************************************/

#include "stdafx.h"

union
{
    int i;
    char x[2];
}u;

int _tmain(int argc, _TCHAR* argv[])
{
    const char *phello = "Hello World";
    char chello[] = "Hello World";
    int a[5] = { 1, 2, 3, 4, 5 };
    int *p = (int*)(&a + 1);
    u.x[0] = 10;
    u.x[1] = 1;
    printf("%d,%d\n", sizeof(phello), sizeof(chello));      //4,12
    printf("%d,%d\n", *(a + 1),*(p - 1));                   //2,5
    printf("%d\n", u.i);                                    //266
    return 0;
}
/*
对象的构造从类层次的最根处开始,在每一层中,首先调用基类的构造函数,然后调用成员对象的构造函数。析构则严格按照与
构造相反的次序执行,该次序是唯一的,否则编译器将无法自动执行析构过程。
一个有趣的现象是,成员对象初始化的次序完全不受它们在初始化表中次序的影响, 只由成员对象在类中声明的次序决定。
这是因为类的声明是唯一的,而类的构造函数可以有多个,因此会有多个不同次序的初始化表。如果成员对象按照初始化表的
次序进行构造,这将导致析构函数无法得到唯一的逆序。

堆区(heap) —— 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。
    注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
栈区(stack)—— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈。
*/
/*****************************************
> File Name : test.cpp
> Description : c/c++ 笔试题
64bit win7 VS2013
A().
A().
B().
A().
B().
C().
A::funA...
B::funB...
B::funA...
B::funB...
~A().
~C().
~B().
~A().
~A().
> Author : linden
> Date : 2016-02-28
*******************************************/

#include "stdafx.h"
#include "iostream"

using namespace std;

class A
{
public:
    A(){ printf("A().\n"); }
    ~A(){ printf("~A().\n"); }
    void funA(){ printf("A::funA...\n"); };
    virtual void funB(){ printf("A::funB...\n"); };
};

class B : public A
{
public:
    B(){ printf("B().\n"); }
    virtual ~B(){ printf("~B().\n"); }
    void funA(){ printf("B::funA...\n"); };
    virtual void funB(){ printf("B::funB...\n"); };
};

class C : public B
{
public:
    C(){ printf("C().\n"); }
    ~C(){ printf("~C().\n"); }
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    B* b = new B;   //堆区(heap)
    A* p = (A*)b;
    B* c = new C;
    p->funA();
    p->funB();
    b->funA();
    b->funB();
    delete p;
    delete c;
    return 0;
}
/*****************************************
> File Name : test.cpp
> Description : c/c++ 笔试题
    64bit win7 VS2013
    数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。
    http://www.nowcoder.com/questionTerminal/1df0bce1bd7d47818fc76c2b4e3fe125?orderByHotValue=0&pos=28&mutiTagIds=595
    http://www.cnblogs.com/GODYCA/p/3352267.html
    http://blog.163.com/shi_shun/blog/static/2370784920138293181963/
> Author : linden
> Date : 2016-02-28
*******************************************/

#include "stdafx.h"
#include "iostream"

using namespace std;

int ConvertN(int a[], int len, int L);

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

    return 0;
}
/*****************************************
> File Name : test.cpp
> Description : c/c++ 笔试题
    64bit win7 VS2013
    编写String类
> Author : linden
> Date : 2016-02-28
*******************************************/

#include "stdafx.h"
#include "iostream"

using namespace std;

class String
{
public:
    String();
    ~String();
    String(const char* str);
    String(const String& rhs);
    String& operator=(String& rhs);
private:
    char* m_data;
};

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

    return 0;
}

如何把一个int类型的变量放入一个buffer中,和从buffer中取出一个int变量。要求buffer在不同平台之间通过网络传输,获取的int数据是一样的。请写出两种方法,一种为二进制的格式,一种是文本的格式。要求:调用c的库函数实现.
//aData为输入参数,aBuffer为输出参数,指向要写的内存。
int WriteIntData(int aData, char* aBuffer)
int WriteIntText(int aData, char* aBuffer)
//aData为输出参数,存放读出的结果。aBuffer为输入参数,包含所需数值。
int ReadIntData(int* aData, const char* aBuffer)
int ReadIntText(int* aData, const char* aBuffer)

实现解析字符串IP地址格式到数据结构格式的函数,使用c语言实现
struct IPAddr{
unsigned char ip[4];
unsigned short port;
};
ip_str:为输入参数,例如:”103.22.11.15:22”
aIPAddr:为输出参数,存放解析的结果
int ParserIP(const char* ip_str, struct IPAddr* aIPAddr)
编写宏,求出3个数中最大值。

#define MAX3(a,b,c) (a>b?(a>c?a:c):(b>c?b:c))

int (*s[10])(int) 表示的是什么?
答案:int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。
实现函数:void *memmove(void *dst, const void *src, size_t count)

void* memmove(void* dst,const void* src,size_t count)
{
    void* ret = dst;
    //dst <= src表示,如果dst在src的前面,从前往后复制不会覆盖src中还没有复制的内容

    if (dst <= src || (char*)dst >= ((char*)src + count))
    {
        //从前往后复制,则不会出现覆盖src中没有复制的内容
        while(count--)
        {
            *(char*)dst = *(char*)src; //char类型指针,表示一个字节一个字节的复制
            dst = (char*)dst + 1; //移动一个字节
            src = (char*)src + 1;
        }
    }
    else
    {
        //从后往前复制,则不会出现覆盖src中没有复制的内容
        dst = (char*)dst + count - 1;//移动到末尾
        src = (char*)src + count - 1;
        while(count--)
        {
            *(char*)dst = *(char*)src;
            dst = (char*)dst - 1; //移动一个字节
            src = (char*)src - 1;
        }
    }
    //返回dst的头指针,还方便左值操作。
    //如:ptstr = memmove(ptstr,src,count); cout << memmove(ptstr,src,count);
    return ret; 
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值