/*
*(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;
}